Java 试图在GUI中放置JCheckBox

Java 试图在GUI中放置JCheckBox,java,swing,user-interface,jlist,jcheckbox,Java,Swing,User Interface,Jlist,Jcheckbox,所以我已经为此工作了45分钟,我似乎不明白为什么这么简单的东西不起作用。我有一个非常复杂的图形用户界面,并且已经按照我想要的方式完成了布局中的所有内容,但是当我尝试制作JList的jcheckbox时,它完全没有工作。所以我把我的问题简化为这个测试类,也许我在做一些非常愚蠢的事情,但下面是我的代码: import java.awt.BorderLayout; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax

所以我已经为此工作了45分钟,我似乎不明白为什么这么简单的东西不起作用。我有一个非常复杂的图形用户界面,并且已经按照我想要的方式完成了布局中的所有内容,但是当我尝试制作
JList
jcheckbox
时,它完全没有工作。所以我把我的问题简化为这个测试类,也许我在做一些非常愚蠢的事情,但下面是我的代码:

import java.awt.BorderLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class TestGUI extends JFrame{
    public TestGUI(){
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);
        setTitle("TEST");
        JPanel outside = new JPanel();
        add(outside);
        outside.setLayout(new BorderLayout());
        JList<JCheckBox> checks = new JList<JCheckBox>();
        JCheckBox c = new JCheckBox("Check");
        checks.add(c);
        JScrollPane t = new JScrollPane(checks);
        add(t, BorderLayout.CENTER);
        pack();
    }
    public static void main(String[] args) {
        new TestGUI();
    }
}
导入java.awt.BorderLayout;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
公共类TestGUI扩展了JFrame{
公共TestGUI(){
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(真);
设置标题(“测试”);
JPanel-outside=新的JPanel();
添加(外部);
setLayout(新的BorderLayout());
JList checks=新JList();
JCheckBox c=新的JCheckBox(“检查”);
加上(c);
JScrollPane t=新的JScrollPane(检查);
添加(t,BorderLayout.CENTER);
包装();
}
公共静态void main(字符串[]args){
新的TestGUI();
}
}
当我运行GUI时,没有显示任何内容…只有空白空间,没有复选框

  • 不要不必要地扩展
    JFrame
  • 在所有组件都已安装之前,不要调用
    JFrame#setVisible(true)
    已添加
  • 对UI组件使用事件分派线程/初始线程
  • 您可以在外部添加
    JPanel
    ,然后在上面添加
    JScrollPane
    我不认为那是你想做的
  • 我能够为您编写一个简短的示例,它使用自定义的
    ListCellRenderer
    JList
    中渲染
    JCheckBox
    。它还使用
    MouseAdapter
    来允许选中和取消选中
    JCheckBox

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.ListCellRenderer;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    
    public class JListTest {
    
        public JListTest() {
            JFrame frame = new JFrame();
            frame.setTitle("JList Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            initComponents(frame);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        private void initComponents(JFrame frame) {
            String[] strs = {"swing", "home", "basic", "metal"};
    
            final JList checkBoxesJList = new JList(createData(strs));
            checkBoxesJList.setCellRenderer(new CheckListRenderer());
            checkBoxesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    
            checkBoxesJList.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    int index = checkBoxesJList.locationToIndex(e.getPoint());
                    CheckableItem item = (CheckableItem) checkBoxesJList.getModel().getElementAt(index);
                    item.setSelected(!item.isSelected());
                    Rectangle rect = checkBoxesJList.getCellBounds(index, index);
                    checkBoxesJList.repaint(rect);
                }
            });
    
            JScrollPane scrollPane = new JScrollPane(checkBoxesJList);
            frame.add(scrollPane, BorderLayout.CENTER);
        }
    
        private CheckableItem[] createData(String[] strs) {
            int n = strs.length;
            CheckableItem[] items = new CheckableItem[n];
            for (int i = 0; i < n; i++) {
                items[i] = new CheckableItem(strs[i]);
            }
            return items;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new JListTest();
                }
            });
        }
    }
    
    class CheckListRenderer extends JCheckBox implements ListCellRenderer {
    
        public CheckListRenderer() {
            setBackground(UIManager.getColor("List.textBackground"));
            setForeground(UIManager.getColor("List.textForeground"));
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean hasFocus) {
            setEnabled(list.isEnabled());
            setSelected(((CheckableItem) value).isSelected());
            setFont(list.getFont());
            setText(value.toString());
            return this;
        }
    }
    
    class CheckableItem {
    
        private String str;
        private boolean isSelected;
    
        public CheckableItem(String str) {
            this.str = str;
            isSelected = false;
        }
    
        public void setSelected(boolean b) {
            isSelected = b;
        }
    
        public boolean isSelected() {
            return isSelected;
        }
    
        @Override
        public String toString() {
            return str;
        }
    }
    

    导入java.awt.BorderLayout;
    导入java.awt.Component;
    导入java.awt.Rectangle;
    导入java.awt.event.MouseAdapter;
    导入java.awt.event.MouseEvent;
    导入javax.swing.JCheckBox;
    导入javax.swing.JFrame;
    导入javax.swing.JList;
    导入javax.swing.JScrollPane;
    导入javax.swing.ListCellRenderer;
    导入javax.swing.ListSelectionModel;
    导入javax.swing.SwingUtilities;
    导入javax.swing.UIManager;
    公共类测试{
    公共测试(){
    JFrame=新JFrame();
    框架.setTitle(“JList测试”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    初始组件(框架);
    frame.pack();
    frame.setVisible(true);
    }
    私有组件(JFrame){
    字符串[]strs={“swing”、“home”、“basic”、“metal”};
    最终JList复选框列表=新JList(createData(strs));
    setCellRenderer(新的CheckListRenderer());
    复选框列表。设置选择模式(列表选择模式。单选);
    checkBoxesJList.addMouseListener(新的MouseAdapter(){
    公共无效mouseClicked(MouseEvent e){
    int index=checkBoxesJList.locationToIndex(e.getPoint());
    CheckableItem=(CheckableItem)CheckboxesList.getModel().getElementAt(索引);
    item.setSelected(!item.isSelected());
    矩形rect=checkBoxesJList.getCellBounds(index,index);
    复选框列表。重新绘制(rect);
    }
    });
    JScrollPane scrollPane=新的JScrollPane(复选框列表);
    frame.add(滚动窗格,BorderLayout.CENTER);
    }
    私有可检查项[]createData(字符串[]strs){
    int n=标准长度;
    CheckableItem[]items=新的CheckableItem[n];
    对于(int i=0;i
    参考资料:


    a)当鼠标事件发生在复选框(而非文本)区域时,您只想更改可检查的选定状态b)可检查应可观察,以便模型可以侦听其更改c)b)到位后,无需手动调用重新绘制,我不知道把JCheckbox放进滚动窗格会有这么大的麻烦。但是非常感谢您的帮助和提示,我一定会进一步清理我的实际GUI。还有一个问题,您的CheckListRenderer的GetListCellRenderer组件,是什么基本上使复选框出现的?@Keegan我不是,但是的(这只适用于在
    JList
    中显示swing组件),谢谢您很高兴我的帮助。是的,
    GetListCellRenderComponent
    基本上就是它出现的原因:)@kleopatra感谢你一如既往的伟大提示+1:)适用于所有的同事