JCheckBox未显示(文本出现,但没有复选框)

时间:2013-11-16 22:21:50

标签: java swing jcheckbox

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class SideNotes {

public static JPanel panel = new JPanel();
private List<String> notes = new ArrayList<String>();
private static JButton add = new JButton("Add note");

public SideNotes() {
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.add(add);
    loadNotes();
    add.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            addNote();
        }
    });
}

public void addNote() {
    String note = JOptionPane.showInputDialog("Enter note: ", null);
    notes.add(note);
    JLabel label = new JLabel(note);
    panel.add(label);
    panel.revalidate();
    panel.repaint();
}

private void loadNotes() {
    for (int i = 0; i < notes.size(); i++) {
        JCheckBox jcb = new JCheckBox(notes.get(i), false);
        panel.add(jcb);
        panel.revalidate();
        panel.repaint();
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(200, 400);
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.add(add);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    new SideNotes();
}

}

为什么我的JCheckBox不出现?文本显示但不是实际的框。这是什么交易?

我已经编辑了我的帖子以包含我的所有代码,以防有助于解决问题。

needmoretextneedmoretextneedmoretextneedmoretextneedmoretextneedmoretextneedmoretext

2 个答案:

答案 0 :(得分:3)

可能的原因:

  • 面板尚未添加到GUI
  • 面板已添加但由于某种原因不可见。
  • 面板太小,无法显示子组件。例如,如果您设置组件的大小或preferredSize,或者如果您将其放在使用FlowLayout的容器中,则可能会发生这种情况。
  • 面板使用null布局。
  • 面板的布局管理器不是一个容易接受新组件的人 - 想想这个的GroupLayout。
  • 还有其他未指定的布局管理器问题。你在GUI上调用了pack()吗?你在任何地方使用空布局或绝对定位吗?你需要把面板放在JScrollPane吗?

考虑创建并发布sscce以获得更好的帮助。


修改

  • 您发布的代码不会将任何JCheckBox添加到JPanel,只是JLabel。要证明这一点,请点击标签,您会发现他们没有响应点击次数。
  • 您的代码严重过度使用静态字段。摆脱所有变量的所有静态修饰符。它们都应该是实例变量。上面代码中唯一的静态内容应该是主要方法,就是这样。如果这会导致错误,则修复错误,但不要将字段设为静态。
  • 为您的SideNotes类提供一个返回面板字段的方法getPanel()
  • 在main方法的开头中创建一个SideNotes实例。然后在实例上调用上面的方法来获取JFrame的JPanel。即,frame.add(sideNotes.getPanel());
  • 不要将JLabel添加到GUI(我不知道你为什么要这样做)。在actionPerformed方法中添加JCheckBox。

答案 1 :(得分:1)

每次按下按钮,面板上都会添加一个新的音符(JLabel)。但是在添加新笔记之后,你永远不会打电话给loadNotes()。因此,JLabel已添加,但未按预期添加JCheckBox

除此之外,我建议你做出这样的改变:

public void addNote() {
    String note = JOptionPane.showInputDialog("Enter note: ", null);
    if(notes != null) {
        notes.add(note);
        JLabel label = new JLabel(note);
        panel.add(label);
        panel.add(new JCheckBox(note, false));
        panel.revalidate();
        panel.repaint();
    }
}

因此,您无需调用loadNotes()并只需更新一次GUI。