如何通过 selecting header 在 JDialog 中 select JTable 的一列
How to select a column of a JTable in JDialog by selecting a header
我一直试图用 JDialog
做的是...
- 点击header
到select一列JTable
- 检查用户select编辑了哪一列
- 获取列内单元格的值
根据 this post and this page ,可以通过单击 header 来 select 列,通过设置 JTableHeader
.
但是,它们似乎都不适用于我正在尝试做的事情。
首先,我不确定该放在哪里JTableHeader
。上面的例子似乎已经把它用于初始化,但我没有看到任何合适的 space 在我的编码中这样做。
至少我知道第二个例子是JPanel
。所以,为了在JDialog
中有一个JTableHeader
,JTableHeader
需要设置在一个完全不同的位置,因为JDialog的initComponents()
默认是不能手动修改的。
此外,我找不到如何 select a header(与单个单元格不同)。我假设我需要事先设置一个JTableHeader
。
最后,我没有看到任何方法来检测哪一列是 selected。至少我找到了 jTable.getValueAt(int, int)
方法,但是这个方法似乎是为了获取单个单元格。
现在我怀疑用 JTable 和 JDialog 做这些可能是不可能的。如果您能提供任何见解,我将不胜感激。
我添加了initComponents()
的一部分,以便您更容易理解。
private void initComponents() {
//here are irrelevant codes
jTable1 = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jLabel1.setFont(new java.awt.Font("MS UI Gothic", 3, 18)); // NOI18N
jLabel1.setText("Choose level(s) or unit(s)");
//irrelevant codes
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{"EN6", "EN3", "EN5", "IN1"},
{"EN2", "EN3", null, "IN4"},
{null, null, null, "IN1"},
{null, null, null, "IN2"},
new String [] {
"EN2", "EN3", "EN5", "IN1"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
});
//lots of lines, seem to be irrelevant
pack();
}
您可以使用此方法获取 select 单元格的值。但这是你想要的吗?
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
if (arg0.getClickCount() == 1) { // 1 : one click, 2 : double click, 3 : right click
int column = table.getSelectedColumn();
int row = table.getSelectedRow();
String str = (String) table.getValueAt(row, column);
int[] rows = table.getSelectedRows();
String str2 = (String) table.getValueAt(rows[0], column);
}
}
});
"[...]it would be possible to select a column by clicking the header, by setting a JTableHeader."
根据您的要求,我认为您不需要提供自己的 table header,而是将 MouseListener 附加到默认值。通过这种方式并使用行和列选择模型,您可以轻松实现您的目标。
片段
final JTable table = new JTable(tableModel);
table.setColumnSelectionAllowed(true);
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// Get the right column based on MouseEvent#getPoint()
int columnIndex = table.columnAtPoint(e.getPoint());
// Set this column as the selected one in the columns selection model
table.getColumnModel().getSelectionModel().setSelectionInterval(columnIndex, columnIndex);
// Set all the rows as the selected ones in the rows selection model
table.getSelectionModel().setSelectionInterval(0, table.getRowCount() - 1);
// Print the values in selected column
for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
System.out.println(table.getValueAt(rowIndex, columnIndex));
}
}
});
注意:不要忘记允许选择列。
参见:
我一直试图用 JDialog
做的是...
- 点击header 到select一列
- 检查用户select编辑了哪一列
- 获取列内单元格的值
JTable
根据 this post and this page ,可以通过单击 header 来 select 列,通过设置 JTableHeader
.
但是,它们似乎都不适用于我正在尝试做的事情。
首先,我不确定该放在哪里JTableHeader
。上面的例子似乎已经把它用于初始化,但我没有看到任何合适的 space 在我的编码中这样做。
至少我知道第二个例子是JPanel
。所以,为了在JDialog
中有一个JTableHeader
,JTableHeader
需要设置在一个完全不同的位置,因为JDialog的initComponents()
默认是不能手动修改的。
此外,我找不到如何 select a header(与单个单元格不同)。我假设我需要事先设置一个JTableHeader
。
最后,我没有看到任何方法来检测哪一列是 selected。至少我找到了 jTable.getValueAt(int, int)
方法,但是这个方法似乎是为了获取单个单元格。
现在我怀疑用 JTable 和 JDialog 做这些可能是不可能的。如果您能提供任何见解,我将不胜感激。
我添加了initComponents()
的一部分,以便您更容易理解。
private void initComponents() {
//here are irrelevant codes
jTable1 = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jLabel1.setFont(new java.awt.Font("MS UI Gothic", 3, 18)); // NOI18N
jLabel1.setText("Choose level(s) or unit(s)");
//irrelevant codes
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{"EN6", "EN3", "EN5", "IN1"},
{"EN2", "EN3", null, "IN4"},
{null, null, null, "IN1"},
{null, null, null, "IN2"},
new String [] {
"EN2", "EN3", "EN5", "IN1"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
});
//lots of lines, seem to be irrelevant
pack();
}
您可以使用此方法获取 select 单元格的值。但这是你想要的吗?
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
if (arg0.getClickCount() == 1) { // 1 : one click, 2 : double click, 3 : right click
int column = table.getSelectedColumn();
int row = table.getSelectedRow();
String str = (String) table.getValueAt(row, column);
int[] rows = table.getSelectedRows();
String str2 = (String) table.getValueAt(rows[0], column);
}
}
});
"[...]it would be possible to select a column by clicking the header, by setting a JTableHeader."
根据您的要求,我认为您不需要提供自己的 table header,而是将 MouseListener 附加到默认值。通过这种方式并使用行和列选择模型,您可以轻松实现您的目标。
片段
final JTable table = new JTable(tableModel);
table.setColumnSelectionAllowed(true);
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// Get the right column based on MouseEvent#getPoint()
int columnIndex = table.columnAtPoint(e.getPoint());
// Set this column as the selected one in the columns selection model
table.getColumnModel().getSelectionModel().setSelectionInterval(columnIndex, columnIndex);
// Set all the rows as the selected ones in the rows selection model
table.getSelectionModel().setSelectionInterval(0, table.getRowCount() - 1);
// Print the values in selected column
for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
System.out.println(table.getValueAt(rowIndex, columnIndex));
}
}
});
注意:不要忘记允许选择列。
参见: