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);
}
我在 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);
}