6

クリック時に表示する表示ボタンJTableがありますが、テーブルが表示されません。注:JScrollPaneコードを削除すると正しく機能しますが、テーブルのヘッダーは表示されません。JScrollPane

        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;

        import javax.swing.JButton;
        import javax.swing.JFrame;
        import javax.swing.JScrollPane;
        import javax.swing.JTable;
        import javax.swing.table.DefaultTableModel;

        public class Training extends JFrame {

            public Training() {

                getContentPane().setLayout(new FlowLayout());
                JTable table = new JTable();
                table.setModel(new DefaultTableModel(new Object[][] { { "joe", "joe" },
                        { "mickel", "mickel" }, }, new String[] { "LastName",
                        "FirstName" }));
                final JScrollPane pane = new JScrollPane(table);
                pane.setVisible(false);
                getContentPane().add(pane);

                JButton btn = new JButton("show");
                add(btn);
                btn.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        pane.setVisible(true);
                    }
                });
            }

            public static void main(String[] args) {
                Training app = new Training();
                app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                app.setSize(600, 600);
                app.setVisible(true);
            }
        }
4

2 に答える 2

8

pane.setVisible(true);以下を追加した後:

getContentPane().validate();
getContentPane().repaint();
于 2012-11-21T16:01:57.200 に答える
5

注意すべき点がいくつかあります。

  • クラスを不必要に拡張JFrameしないでください。または、非常に必要な別のクラスを拡張する必要がある場合がありますが、Java では、1 つのクラスが他の複数のクラスを拡張することはできません (多重継承はありません)。

  • Swing コンポーネントは常にブロック経由でイベント ディスパッチ スレッドに作成します。SwingUtilities.invokeLater(Runnable r)

  • 可視に設定する前にsetSize(..) callを使用しないでくださいJFrame#pack()JFrame

  • orの必要はありません。これらの呼び出しはcontentPaneに渡されるため、インスタンス上でgetContentPane.add(..)orをgetContentPane().setLayout(..)呼び出すだけです。add(..)setLayout(..)JFrame

  • あなたが抱えている問題は、ペインを可視に設定した後にフレーム/コンテナを更新しないことです。@ダンに同意しません。使用しないでくださいvalidate()(getContentPane()どちらも必要ありません)。

    revalidate();
    repaint();
    

revalidate()カバーとしてvalidate()。また、validate は新しいJComponentが可視コンポーネントに追加されrevalidate()たときに使用されますJComponentが、 は可視コンポーネントから削除/追加されたときに使用されます。

上記を実装したコードの修正バージョンを次に示します。

ここに画像の説明を入力

ボタンを押した後:

ここに画像の説明を入力

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class Training {

    private JFrame frame;

    public Training() {
        frame = new JFrame();
        frame.setLayout(new FlowLayout());
        JTable table = new JTable();
        table.setModel(new DefaultTableModel(new Object[][]{{"joe", "joe"},
                    {"mickel", "mickel"},}, new String[]{"LastName",
                    "FirstName"}));
        final JScrollPane pane = new JScrollPane(table);
        pane.setVisible(false);
        frame.add(pane);

        JButton btn = new JButton("show");
        frame.add(btn);

        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pane.setVisible(true);

                frame.pack();//this is so the frame will resize after adding pane
                frame.revalidate();
                frame.repaint();
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Training();
            }
        });
    }
}

アップデート:

また、より再利用可能なのためLayoutに、すべてのコンポーネントを にJPanel追加し、それを に追加してJPanelみませんJFrameか。

于 2012-11-21T16:55:55.443 に答える