2

JTableを押した結果として含まれる新しいウィンドウを作成したいのですJMenuItemが、アクションリスナー内に新しいクラスを作成しようとしましたが、それがどれほど正しいかわかりません。とにかくうまくいかないのでアドバイスお願いします。

...

help.add(currencyTable);
...

        //action listener for the currency table JMenuItem button

        currencyTable.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                class currencyJTableClass extends JFrame
                {
                    JTable currencyTable;

                    public currencyJTableClass()
                    {
                        setLayout(new FlowLayout());
                        String[] headLine = {"x","y","z"} ;
                        String [][] currencyData =
                                {
                                        {
                                          "a","b","c"
                                        },
                                        {
                                          "d","e","f"
                                        },
                                };
                        currencyJTable = new JTable(currencyData,headLine);
                    }


                } 
4

2 に答える 2

2

この道を進む決意を固めているように見えるあなたには、いくつかの選択肢があります...

難しい方法...

public void actionPerfomed(ActionEvent e) {

    TableModel model = //... Create the new model based on you needs
    JTable table = new JTable(model);

    JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout());
    frame.add(new JScrollPane(table));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

}

これには、アクションリスナーごとにこのコードを複製する必要があります...それは多くのコードです...

やや簡単

必要なすべてのロジックをいくつかの基本クラスにラップする単純な実装を自分で作成します...

public class ModelPane extends JPanel {

    private JTable table;

    public ModelPane(TableModel model) {
        setLayout(new BorderLayout());
        table = new JTable(model);
        add(new JScrollPane(table));
    }

}

public class ModelFrame extends JFrame {

    public ModelFrame(TableModel model) {
        setLayout(new BorderLayout());
        add(new ModelPane(model));
        pack();
        setLocationRelativeTo(null);
    }

}

次に、actionPerformedメソッドで簡単に行うことができます...

public void actionPerfomed(ActionEvent e) {
    TableModel model = //... Create the new model based on you needs
    ModelFrame frame = new ModelFrame(model);
    frame.setVisible(true);
}

これにより、テーブルとデータを表示および管理するためのコア ロジックが一元化されます。

少し良く

2 番目のオプションを使用すると、ActionAPI を使用して、モデルを生成するために必要な情報を提供する基本アクションを生成できますが、基本アクション クラスはactionPerformedメソッドがどのように機能するかを実際に決定できます...

public abstract class AbstractModelAction extends AbstractAction {

    public abstract TableModel getModel();

    @Override
    public void actionPerformed(ActionEvent e) {
        ModelFrame frame = new ModelFrame(getModel());
        frame.setVisible(true);
    }
}

public class CurrencyModelAction extends AbstractModelAction {

    @Override
    public TableModel getModel() {
        return //... Create the new model based on you needs
    }

}

詳細については、アクションの使用方法を確認してください...

結論

最も柔軟で、再利用が最適な方法を使用してください。カスタム s を作成することはめったにありませんJFrame。これは、パネルを作成することを好むためです。これは、柔軟で再利用可能な、必要なコンテキストでパネルを再利用できることを意味します;)

于 2013-01-12T01:07:31.610 に答える
2

JFrameまたはを作成しないJTableでくださいActionListener。むしろ、起動 に と. 次に、表示するデータでモデルを更新します。JFrameJTableTableModelActionListener

テーブルモデルの使用方法を学び始めるときは、addRowremoveRowDefaultTableModelを使用してモデルへの動的な変更をサポートしているため、 から始めてください。

ここに例があります

注:データを表示するために別のウィンドウを作成する必要がある場合は、次の可能性があります

  • モーダルを使用するJDialog— ユーザーのフォーカスをウィンドウ内のコンテンツに引き寄せます
  • 代わりにCardLayoutを使用してください— 多くのコンポーネントを簡単に表示できます。
于 2013-01-11T22:53:02.840 に答える