Java JDialog中的JTable

Java JDialog中的JTable,java,swing,jtable,jdialog,Java,Swing,Jtable,Jdialog,我在JDialog中使用JTable时遇到问题。我想用以下代码在对话框中显示我的表: public class ShortcutKeys extends JDialog { public ShortcutKeys( JFrame parent ) { super( parent ); this.setTitle( "Shortcut Keys of..." ); this.setLocationRelativeTo( null ); this.setModa

我在JDialog中使用JTable时遇到问题。我想用以下代码在对话框中显示我的表:

 public class ShortcutKeys extends JDialog {
  public ShortcutKeys( JFrame parent ) {
    super( parent );
    this.setTitle( "Shortcut Keys of..." );
    this.setLocationRelativeTo( null );
    this.setModal( true );
    this.setResizable( false );
    this.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
    this.getContentPane().setLayout( new BorderLayout() );

    JTable shortcutKeysTable = getShortcutKeysTable();
    this.add( shortcutKeysTable, BorderLayout.CENTER );

    this.pack();
  }

  private JTable getShortcutKeysTable() {
    JTable shortcutKeysTable;

    Object rowData[][] = { { "1", "11" }, { "2", "22"} };
    Object columnNames[] = { "Column One", "Column Two" };

    shortcutKeysTable = new JTable(rowData, columnNames);
    JScrollPane scrollPane = new JScrollPane(shortcutKeysTable);

    this.add(scrollPane, BorderLayout.CENTER);
    this.setSize(300, 150);

    return shortcutKeysTable;
  }

}
所以,问题是,使用这段代码,不会显示列名——只显示没有我的大小的行数据,结果是在一个小表中,而不是我的首选项。 但在方法或构造函数中,我添加了以下行:

this.setVisible( true );
然后此表显示大小为300x150的行数据和列,但当我单击“确定”退出“X”时,此对话框当然消失,但显示新的空对话框:


我做错了什么以及如何解决这个问题?

必须添加到对话框中的是scollPane,它本身包含表。不是桌子本身

您应该决定GetShortcutKeysTable的功能:

它创建一个表、一个滚动窗格,并将scollPane添加到对话框中,并且应该重构为void createAndAddTable 或者它只是创建一个表并返回它,调用者负责将它包装到一个scollpane中,并将滚动窗格添加到对话框中。 混合这两种职责会使代码变得混乱,即使对于编写代码的人来说也是如此


在任何wase中,设置对话框的大小都不是它的责任,也没有必要,因为您无论如何都要调用pack after。

必须添加到对话框中的是scollPane,它本身包含表。不是桌子本身

您应该决定GetShortcutKeysTable的功能:

它创建一个表、一个滚动窗格,并将scollPane添加到对话框中,并且应该重构为void createAndAddTable 或者它只是创建一个表并返回它,调用者负责将它包装到一个scollpane中,并将滚动窗格添加到对话框中。 混合这两种职责会使代码变得混乱,即使对于编写代码的人来说也是如此

在任何wase中,设置对话框的大小都不是它的责任,也没有必要,因为无论如何都要调用pack after。

您需要调用JDialog.setVisibletrue;以显示对话框

但是您的代码中有一个bug:将表放在滚动窗格中,并将滚动窗格添加到方法getShortcutKeysTable中的对话框中,然后在构造函数中将该表再次添加到对话框中

如果在构造函数中执行此操作,则代码运行良好

    ...
    getShortcutKeysTable();

    this.pack();
    this.setVisible(true);
}
您需要调用JDialog.setVisibletrue;以显示对话框

但是您的代码中有一个bug:将表放在滚动窗格中,并将滚动窗格添加到方法getShortcutKeysTable中的对话框中,然后在构造函数中将该表再次添加到对话框中

如果在构造函数中执行此操作,则代码运行良好

    ...
    getShortcutKeysTable();

    this.pack();
    this.setVisible(true);
}

谢谢你的快速回答。我从方法JScrollPanel对象中删除了它,并在构造函数中更改了this.addshortcutkeystable,BorderLayout.CENTER;添加新的JScrollPanelshortcutKeysTable,BorderLayout.CENTER;现在一切都好了。谢谢:谢谢你的快速回答。我从方法JScrollPanel对象中删除了它,并在构造函数中更改了this.addshortcutkeystable,BorderLayout.CENTER;添加新的JScrollPanelshortcutKeysTable,BorderLayout.CENTER;现在一切都好了。谢谢您: