触发addMouseListener事件后,Java GUI无法完全加载

时间:2013-09-11 07:23:45

标签: java swing jtable jpanel mouse-listeners

我有以下代码来跟踪用户在表格中选择的内容,在用户选择聊天会话后我想要隐藏包含该表格的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组件,这些组件只是白色。

有什么想法导致这种行为?

1 个答案:

答案 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()。