JDialog中的JTable

时间:2016-01-05 17:25:57

标签: 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.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”时,当然此对话框消失但显示新的空对话框:

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

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

2 个答案:

答案 0 :(得分:3)

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

您应该决定getShortcutKeysTable()做什么:

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

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

在任何情况下,设置对话框的大小不是它的责任,而且它是不必要的,因为你无论如何都要调用pack()。

答案 1 :(得分:1)

您需要致电JDialog.setVisible(true);以显示对话框。

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

如果你在构造函数

中运行,你的代码运行正常
    ...
    getShortcutKeysTable();

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