我有以下代码来跟踪用户在表格中选择的内容,在用户选择聊天会话后我想要隐藏包含该表格的JPanel
并显示包含该表格的JPanel
聊天对话。请参阅我当前的代码:
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
JTable target = (JTable) e.getSource();
int row = target.getSelectedRow();
int column = target.getSelectedColumn();
// loop through all elements in the table
for (int i = 0; i < listmodel.size(); i++) {
// get the table item associated with the current element
final Object object = listmodel.get(i);
if (object instanceof ListItem) {
ListItem listitem = (ListItem) object;
if (table.getValueAt(table.getSelectedRow(), 0).toString() == listitem.getText()) {
// Show the chat conversation (this is where the GUI for some reason does not fully load)
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pnlMainTableWrapper.setVisible(false); // Contains the table
pnlChatMsgs.setVisible(true);
pnlSendMsg.setVisible(true);
pnlRight.setVisible(true);
pnlChatMsgs.validate();
pnlChatMsgs.repaint();
}
});
}
}
}
}
}
});
由于某些奇怪的原因,并未加载JPanel
pnlChatMsgs
中的所有GUI组件,这些组件只是白色。
有什么想法导致这种行为?
答案 0 :(得分:1)
每当我看到代码试图在同一个地方使用两个组件时,最好使用Card Layout并让它管理哪个组件随时可见。
如果您尝试自行管理,那么代码在设计时应该是这样的:
JPanel parent = new JPanel();
JPanel child1 = new JPanel();
JPanel child2 = new JPanel();
child2.setVisible(false);
parent.add( child1 );
parent.add( child2 );
然后在交换面板的运行时,你会这样做:
child1.setVisible(false);
child2.setVisible(true);
parent.revalidate();
parent.repaint();
我仍然推荐CardLayout,所以你不要重新发明轮子。
此外,由于所有Swing事件代码都已在EDT上执行,因此可能不需要invokeLater()。