2

我想创建一个新窗口,其中包含JTable按 a 的结果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

不要在你JFrame的. 而是在启动时创建一个带有 a的单曲,以及. 然后,在您的 中,使用您希望显示的数据更新模型。JTableActionListener JFrameJTableTableModelActionListener

当开始学习如何使用表模型时,请从 开始,DefaultTableModel因为它支持使用addRowremoveRow对模型进行动态更改。

这是一个例子

注意:如果您确实需要创建一个单独的窗口来显示数据,一些可能性是:

  • 使用模式JDialog——将用户的焦点吸引到窗口中的内容
  • 改用CardLayout — 可以轻松显示许多组件。
于 2013-01-11T22:53:02.840 回答
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);
}

这集中了用于显示和管理表格和数据的核心逻辑

好一点

使用第二个选项,您可以使用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
    }

}

查看如何使用操作了解更多信息...

结论

使用最灵活并提供最佳重用的方法。我很少创建 custom JFrame,仅仅是因为我更喜欢创建面板,因为这意味着我可以在我想要的任何上下文中重复使用它们,灵活且可重复使用;)

于 2013-01-12T01:07:31.610 回答