试图将JCheckBox放入GUI中

时间:2012-10-18 06:02:59

标签: java swing user-interface jlist jcheckbox

所以我现在已经做了45分钟的工作了,我似乎无法弄清楚为什么这么简单的东西不起作用。我有一个非常复杂的GUI,并且按照我想要的方式在布局中得到了所有内容,但是当我尝试JList JCheckBoxes时,它完全不起作用。所以我把问题简化到了这个测试类,也许我正在做一些非常愚蠢的事情,但这是我的代码:

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();
    }
}

当我运行GUI时,没有任何内容显示...只是空格,没有复选框...

1 个答案:

答案 0 :(得分:2)

  1. 不要不必要地延长JFrame课程。
  2. 在所有组件出现之前,请勿致电JFrame#setVisible(true) 已被添加。
  3. 为UI组件使用Event-Dispatch-Thread / Intial Thread
  4. 您在外面添加JPanel,然后在其上添加JScrollPane 我不认为这就是你想做的事情?
  5. 我能够为您准备一个简短示例,该示例使用自定义ListCellRendererJCheckBox中呈现JList。它还使用MouseAdapter来检查和取消选中JCheckBox

    enter image description here

    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;
        }
    }
    

    <强>参考: