0

我有以下代码来跟踪用户在表格中选择的内容,在用户选择聊天对话后,我想隐藏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();
                                   }
                               });
                           }
                       }
                   }                    
               }
           }
       });

由于某些奇怪的原因,并非所有 GUI 组件JPanel pnlChatMsgs都被加载,这些组件只是白色的。

任何想法是什么导致了这种行为?

4

1 回答 1

1

每当我看到代码试图在同一个地方使用两个组件时,最好使用卡片布局并让它管理哪个组件随时可见。

如果您尝试自己管理它,那么代码在设计时应该是这样的:

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 这样你就不会重新发明轮子。

此外,invokeLater() 可能不是必需的,因为所有 Swing 事件代码都已在 EDT 上执行。

于 2013-09-11T15:11:25.800 回答