我在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 BUT。退出“ X”,然后此对话框当然消失了,但显示了一个新的空对话框:

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

我做错了什么,该如何解决呢?

最佳答案

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

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


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


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

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

09-25 21:42