我正在尝试根据我的数据库中的内容将复选框动态添加到滚动 Pane 。目前我有
ResultSet rs = getAvailableUsers();
try {
while (rs.next()){
User temp = new User();
temp.setUsername(rs.getString("username"));
temp.setUserNo(rs.getInt("userno"));
JCheckBox tempCheckBox = new JCheckBox();
tempCheckBox.setText(temp.getUsername());
tempCheckBox.setVisible(true);
checkBoxes.add(tempCheckBox);
}
} catch (SQLException ex) {
Logger.getLogger(SelectProjectTeamGUI.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(checkBoxes);
panel.setLayout(new GridLayout(0,1));
panel.setVisible(true);
scrollPane.removeAll();
scrollPane = new JScrollPane(panel);
for (int i = 0; i < checkBoxes.size(); i++){
panel.add(checkBoxes.get(i));
//panel.repaint();
System.out.println(i);
}
scrollPane.setVisible(true);
我可以看到滚动 Pane 的轮廓,但那里没有任何复选框。所有的复选框都存储在一个 vector 中,然后拉出并一次一个地添加到面板中。任何想法为什么它没有显示任何东西?我知道复选框在 vector 中,因为我已经打印出来并在那里看到了它们。
提前感谢您的帮助。
最佳答案
调用
panel.removeAll();
而不是scrollPane.removeAll();
存在逻辑问题
JComponent
被添加到JViewport
而不是JScrollPane
然后调用(在所有 Items 添加到
JPanel
之后)panel.revalidate()
和panel.repaint()
作为空白中的最后一行代码您对 Concurency in Swing 有疑问,对已经可见的
Swing GUI
的所有更新都必须在Event Dispatch Thread
上完成,但在其他方面panel.repaint()
通知事件调度线程
并正确
- 将
JList
(不可编辑)或JTable
(可编辑)用于一列(可能删除JTableHeader
)而不是JPanel
带有一堆JCheckBoxes
和 un_natural 滚动,请注意模型中存储了Boolean
值,代表JCheckBox
在查看
关于java - 将 JCheckBox 添加到 JScrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681352/