Java JList中的组件被白色正方形隐藏,直到单击为止

Java JList中的组件被白色正方形隐藏,直到单击为止,java,swing,user-interface,jlist,jcheckbox,Java,Swing,User Interface,Jlist,Jcheckbox,在我一直从事的一个项目中,我注意到在单击JScrollPane/JList之前,我的JScrollPane中的所有JList项都是隐藏的。奇怪的是它没有被完全覆盖。这是一个白色的盒子,它有一个透明的边框,覆盖了所有的边缘,除了几个像素 图片: 正如你所看到的,中间有白色的块,注意粉红的“边框”: 现在,一旦我点击那个白色框,它就会消失: 我知道洋红看起来很可怕,但我用它来对比 这就引出了我的问题:我如何摆脱那个讨厌的白盒子 这是我的密码: public static void listJar

在我一直从事的一个项目中,我注意到在单击JScrollPane/JList之前,我的JScrollPane中的所有JList项都是隐藏的。奇怪的是它没有被完全覆盖。这是一个白色的盒子,它有一个透明的边框,覆盖了所有的边缘,除了几个像素

图片:

正如你所看到的,中间有白色的块,注意粉红的“边框”:

现在,一旦我点击那个白色框,它就会消失:

我知道洋红看起来很可怕,但我用它来对比

这就引出了我的问题:我如何摆脱那个讨厌的白盒子

这是我的密码:

public static void listJars(File f)
{
    JCheckBox firstBox = null;
    DefaultListModel<JCheckBox> model = new DefaultListModel<>();
    if(mainGUI.checkList != null)
    {
        //System.out.println("Already exists lol: " + mainGUI.checkList.getName());
        mainGUI.pluginList.remove(mainGUI.checkList);
    }
    //mainGUI.pluginList.repaint();

    File[] files = new File(f.getPath()).listFiles();
    if (files != null)
    {
        for (File file : files)
        {
            if (file.getName().endsWith(".jar") || file.getName().endsWith("._jar"))
            {
                JCheckBox cb = new JCheckBox(file.getName());

                if(firstBox == null)
                {
                    firstBox = cb;
                }

                cb.setSelected(file.getName().endsWith(".jar"));
                cb.setVisible(true);
                cb.setText(file.getName());
                model.addElement(cb);
                cb.repaint();
            }
        }
    }

    JCheckBoxList jCheckBoxList = new JCheckBoxList(model, mainGUI.textField1.getText());
    jCheckBoxList.setName("pluginCheckboxList");
    jCheckBoxList.setSize(mainGUI.pluginList.getSize());
    mainGUI.pluginList.add(jCheckBoxList);
    mainGUI.checkList = jCheckBoxList;
    jCheckBoxList.setVisible(true);
    jCheckBoxList.setVisibleRowCount(10);
}
publicstaticvoidlistjars(文件f)
{
JCheckBox firstBox=null;
DefaultListModel=新的DefaultListModel();
if(mainGUI.checkList!=null)
{
//System.out.println(“已存在lol:+mainGUI.checkList.getName());
mainGUI.pluginList.remove(mainGUI.checkList);
}
//mainGUI.pluginList.repaint();
File[]files=新文件(f.getPath()).listFiles();
如果(文件!=null)
{
用于(文件:文件)
{
if(file.getName().endsWith(“.jar”)| | file.getName().endsWith(“.jar”))
{
JCheckBox cb=newjcheckbox(file.getName());
if(firstBox==null)
{
firstBox=cb;
}
cb.setSelected(file.getName().endsWith(“.jar”);
cb.setVisible(真);
cb.setText(file.getName());
模型.加法(cb);
cb.repaint();
}
}
}
JCheckBoxList JCheckBoxList=新的JCheckBoxList(model,mainGUI.textField1.getText());
setName(“plugincheckbox列表”);
jCheckBoxList.setSize(mainGUI.pluginList.getSize());
mainGUI.pluginList.add(jcheckbox列表);
mainGUI.checkList=jcheckbox列表;
jCheckBoxList.setVisible(true);
jCheckBoxList.setVisibleRowCount(10);
}
还有十个是我的JCheckBoxList课程

package Components;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;

@SuppressWarnings("serial")
public class JCheckBoxList extends JList<JCheckBox>
{
    protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
    protected String lastPath;

    public JCheckBoxList(final String lastPath)
    {
        this.lastPath = lastPath;
        setCellRenderer(new CellRenderer());
        setBackground(Color.magenta);
        addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                int index = locationToIndex(e.getPoint());
                if (index != -1)
                {
                    JCheckBox checkBox = getModel().getElementAt(index);
                    checkBox.setSelected(!checkBox.isSelected());
                    repaint();

                    final String oldname = checkBox.getText();
                    if (!checkBox.isSelected())
                    {
                        checkBox.setName(checkBox.getText().substring(0, checkBox.getText().length() - 4) + "._jar");
                    }
                    else
                    {
                        checkBox.setName(checkBox.getText().substring(0, checkBox.getText().length() - 5) + ".jar");
                    }
                    System.out.println("Changed! Sel: " + checkBox.isSelected() + ", Name: " + checkBox.getName());
                    checkBox.setText(checkBox.getName());
                    String base = new File(lastPath).getParent() + "/plugins/";
                    boolean rename = new File(base + oldname).renameTo(new File(base + checkBox.getText()));
                }
            }
        });
        setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }

    public JCheckBoxList(ListModel<JCheckBox> model, String lastPath)
    {
        this(lastPath);
        setModel(model);
    }

    protected class CellRenderer implements ListCellRenderer<JCheckBox>
    {
        public Component getListCellRendererComponent(
                JList<? extends JCheckBox> list, JCheckBox value, int index,
                boolean isSelected, boolean cellHasFocus)
        {
            //Drawing checkbox, change the appearance here
            value.setBackground(isSelected ? getSelectionBackground()
                    : getBackground());
            value.setForeground(isSelected ? getSelectionForeground()
                    : getForeground());
            value.setEnabled(isEnabled());
            value.setFont(getFont());
            value.setFocusPainted(false);
            value.setBorderPainted(true);
            value.setBorder(BorderFactory.createEmptyBorder(0, 10, 5, 0));
            return value;
        }
    }
}
封装组件;
导入javax.swing.*;
导入javax.swing.border.border;
导入javax.swing.border.EmptyBorder;
导入java.awt.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.io.File;
@抑制警告(“串行”)
公共类JCheckBoxList扩展了JList
{
受保护的静态边框noFocusBorder=新的清空顺序(1,1,1,1);
受保护的字符串路径;
公共JCheckBoxList(最终字符串lastPath)
{
this.lastPath=lastPath;
setCellRenderer(新的CellRenderer());
挫折背景(颜色:洋红色);
addMouseListener(新的MouseAdapter()
{
公共无效鼠标按下(MouseEvent e)
{
int index=locationToIndex(如getPoint());
如果(索引!=-1)
{
JCheckBox checkBox=getModel().getElementAt(索引);
checkBox.setSelected(!checkBox.isSelected());
重新油漆();
最终字符串oldname=checkBox.getText();
如果(!checkBox.isSelected())
{
setName(checkBox.getText().substring(0,checkBox.getText().length()-4)+“.jar”);
}
其他的
{
setName(checkBox.getText().substring(0,checkBox.getText().length()-5)+“.jar”);
}
System.out.println(“更改!选择:”+checkBox.isSelected()+”,名称:“+checkBox.getName());
checkBox.setText(checkBox.getName());
String base=新文件(lastPath).getParent()+“/plugins/”;
布尔重命名=新文件(base+oldname).renameTo(新文件(base+checkBox.getText());
}
}
});
设置选择模式(ListSelectionModel.单选);
}
公共JCheckBoxList(ListModel模型,字符串lastPath)
{
这(最后一条路);
setModel(model);
}
受保护的类CellRenderer实现ListCellRenderer
{
公共组件GetListCellRenderComponent(
列表框
在我看来,您正在向可见GUI动态添加组件

执行此操作时,基本代码为:

panel.add(...);
panel.revalidate();
panel.repaint();
在执行上述代码之前,应该设置visibleRowCount()

此外:

  • Swing组件在默认情况下是可见的,因此您不需要设置visible(true)
  • 您可能想考虑使用单列JTABLE,因为它已经支持复选框渲染器和编辑器。 编辑:

    我上面给你的解决方案是通用解决方案。滚动窗格是不同的,你应该只在视口中添加一个组件

    基于不正确的解决方案,您应该使用:

    //mainGUI.pluginList.add(jCheckBoxList);
    mainGUI.pluginList.setViewportView(jCheckBoxList);
    
    只发布几行随机代码的问题是我们不知道代码的完整上下文。我没有意识到“pluginList”实际上是一个滚动窗格。通常变量名中会有滚动或滚动窗格

        mainGUI.pluginList.setViewportView(mainGUI.checkList); // pluginList is the JScrollPane.
    

    这样做,它就能修复一切!将它与我的listJars方法结合起来。

    要更快地获得更好的帮助,请发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。我会尝试一下。我使用JCheckboxList的原因是因为我最终可能需要使用其他东西。
    我使用JCheckboxList的原因是因为我最终可能需要使用其他东西
    -这就更没有意义了。你为什么要花时间创建一个你甚至不用的自定义组件。保留代码sim卡对不起,我的意思是JCheckboxList,因为它提供了我将来可能需要的灵活性。措辞失败。因此,我自己编辑了…我意识到了我犯的错误,并很快更新了它。已删除
        mainGUI.pluginList.setViewportView(mainGUI.checkList); // pluginList is the JScrollPane.