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

コードが同じ場所で 2 つのコンポーネントを使用しようとしているのを目にするたびに、カード レイアウトを使用して、いつでもどのコンポーネントが表示されるかを管理できるようにすることをお勧めします。

自分で管理しようとすると、コードは設計時に次のようになります。

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() はおそらく必要ありません。

于 2013-09-11T15:11:25.800 に答える