JDialog 中的 JTable

JTable in JDialog

我在 JDialog 中使用 JTable 时遇到问题。我想用这段代码在对话框中显示我的 table:

 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;
  }

}

所以,问题在于正是使用这段代码,不显示列名 - 只有没有我的大小的行数据,结果很小 table 不符合我的喜好。 但是在方法或构造函数中我添加了这一行:

this.setVisible( true );

然后这个 table 显示我的大小为 300x150 的行数据和列但是当我单击确定退出 'X' 然后当然这个对话框消失但显示新的空对话框:

http://i.imgur.com/SzkF5iK.png

我做错了什么,我该如何解决这个问题?

必须添加到对话框的是scollPane,它本身包含table。不是 table 本身。

您应该决定 getShortcutKeysTable() 的作用:

  • 要么创建一个 table,一个 scrollPane,并将 scollPane 添加到对话框(并且应该重构为 void createAndAddTable()
  • 或者它只是创建一个 table 和 returns 它,调用者负责将它包装成一个 scollpane 并将滚动窗格添加到对话框中。

混合这两种职责会使代码变得混乱,即使对于编写代码的您来说也是如此。

无论如何,设置对话框的大小不是它的责任,也不需要,因为无论如何你都会调用 pack()。

您需要调用 JDialog.setVisible(true); 才能显示对话框。

但是您的代码中有一个错误:您将 table 放入滚动窗格并将滚动窗格添加到对话框(在方法 getShortcutKeysTable 中),然后添加 table再次进入对话框(在构造函数中)。

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

    ...
    getShortcutKeysTable();

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