java - 尝试将 JCheckBox 放入 GUI 中

标签 java swing user-interface jlist jcheckbox

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

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. 不必要时不要扩展 JFrame 类。
  2. 在所有组件都完成之前不要调用 JFrame#setVisible(true) 已添加。
  3. 对 UI 组件使用 Event-Dispatch-Thread/Intial Thread
  4. 您在外部添加 JPanel,然后在其顶部添加 JScrollPane 我认为这不是您想做的事?

我可以为您整理一个简短的示例,它使用自定义 ListCellRendererJList 中呈现 JCheckBox。它还使用 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;
    }
}

引用:

关于java - 尝试将 JCheckBox 放入 GUI 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12948062/

相关文章:

java - Gradle多项目根级构建任务

java - CardLayout没有完全隐藏其他卡片?

java - 在调用 JTabbedPane.removeAll() 之后,JTabbedPane 仍然有 x 个选项卡?

java - Java 是如何制作它的窗口的?

user-interface - Flutter TabBarView 子项因高度无限制无法渲染

user-interface - 无法将 GUI 变量保持为全局变量

java - FutureTask 是如何进行异步计算的

java - 如何将代码拆分为同一目录中的两个 .java 文件(使用类)?

Java: Swing 计时器等待

java - 为 Maven 构建的 Web 应用程序指定运行时配置参数