在新窗口中创建JTable作为Java中JMenuItem的操作侦听器
我想创建一个包含在新窗口中创建JTable作为Java中JMenuItem的操作侦听器,java,swing,user-interface,jtable,Java,Swing,User Interface,Jtable,我想创建一个包含JTable的新窗口。由于按了JMenuItem,我尝试在动作侦听器内部创建一个新类,但不确定这是否正确。不管怎样,它不起作用,请建议 ... help.add(currencyTable); ... //action listener for the currency table JMenuItem button currencyTable.addActionListener(new ActionListener() {
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);
}
}
不要在
ActionListener
中创建JFrame
或JTable
。相反,在启动时使用JTable
和TableModel
创建一个JFrame
。然后,在ActionListener
中,使用希望显示的数据更新模型
开始学习如何使用表模型时,请从DefaultTableModel
开始,因为它支持通过使用和对模型进行动态更改
这是一个
注意:如果您确实需要创建一个单独的窗口来显示数据,则有以下几种可能性:
- 使用模态
-将用户焦点吸引到窗口中的内容JDialog
- 改用-允许轻松显示许多组件
ActionListener
中创建JFrame
或JTable
。相反,在启动时使用JTable
和TableModel
创建一个JFrame
。然后,在ActionListener
中,使用希望显示的数据更新模型
开始学习如何使用表模型时,请从DefaultTableModel
开始,因为它支持通过使用和对模型进行动态更改
这是一个
注意:如果您确实需要创建一个单独的窗口来显示数据,则有以下几种可能性:
- 使用模态
-将用户焦点吸引到窗口中的内容JDialog
- 改用-允许轻松显示许多组件
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);
}
这将集中显示和管理表和数据的核心逻辑
好一点
使用第二个选项,您可以使用Action
API生成基本操作,这些操作提供生成模型所需的信息,但允许基本操作类实际确定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
}
}
查看更多信息
结论
使用最灵活且提供最佳重用的方法。我很少创建自定义的
JFrame
s,因为我更喜欢创建面板,因为这意味着我可以在我想要的任何环境中重复使用它们,既灵活又可重用;) 看来你似乎决心走这条路,你有很多选择
艰难的道路。。。
这将需要您在每个操作侦听器中复制此代码…这是大量的代码
稍微容易
自己创建一个简单的实现,将所有必需的逻辑包装成几个基本类
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);
}
这将集中显示和管理表和数据的核心逻辑
好一点
使用第二个选项,您可以使用Action
API生成基本操作,这些操作提供生成模型所需的信息,但允许基本操作类实际确定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
}
}
查看更多信息
结论
使用最灵活且提供最佳重用的方法。我很少创建自定义的
JFrame
s,因为我更喜欢创建面板,因为这意味着我可以在我想要的任何环境中重复使用它们,既灵活又可重用;) 谢谢你的回答。为什么不在动作侦听器中创建一个新的分离的JFrame
/JTable
?这是一种不好的做法还是仅仅是错误的?请看,我现在无法更改我的整个GUI来实现CardLayout
,并且JDialog
将冻结主JFrame
,这是不允许的,因为用户一直在与它交互。我现在明白了创建多个JFrame
s是一种糟糕的做法,但我现在别无选择。更多的可能性?考虑张贴A。这可能属于一个新问题。“JDialog
将冻结主JFrame
”仅当它是模态的。“我现在不能改变我的整个GUI来实现CardLayout
”修复一个糟糕的设计通常比解决当前设计的问题要快。谢谢你的回答。为什么不在动作侦听器中创建一个新的分离的JFrame
/JTable
?这是一种不好的做法还是仅仅是错误的?请看,我现在无法更改我的整个GUI来实现CardLayout
,并且JDialog
将冻结主JFrame
,这是不允许的,因为用户一直在与它交互。我现在明白了创建多个JFrame
s是一种糟糕的做法,但我现在别无选择。更多的可能性?考虑张贴A。这可能属于一个新问题。“JDialog
将冻结主JFrame
”仅当它是模态的。“我现在无法更改整个GUI来实现CardLayout
”修复一个不好的设计通常比解决当前设计的问题要快。这取决于您是否希望打开多个窗口(即,当单击菜单项时,它应该处理任何现有的“子”窗口还是不关心)我有一个主JFrame
窗口,其中有几个JMenuItem
s。我想创建另一个JFrame
窗口,其中包括