Как выбрать столбец JTable в JDialog, выбрав заголовок
Что я пытался сделать с JDialog
являются...
- Чтобы выбрать столбец
JTable
нажав на заголовок - Чтобы проверить, какой столбец выбран пользователем
- Чтобы получить значение ячеек внутри столбца
Согласно этому посту и этой странице, можно будет выбрать столбец, щелкнув заголовок, установив JTableHeader
,
Однако ни один из них, кажется, не применим к тому, что я пытаюсь сделать.
Прежде всего, я не уверен, где поставить JTableHeader
, Представленные выше примеры, кажется, поместили его для инициализации, но я не вижу подходящего места для этого в моем коде.
По крайней мере, я знаю, что второй пример JPanel
, Итак, чтобы иметь JTableHeader
в JDialog
, JTableHeader
нужно будет установить в совершенно другое положение, так как initComponents()
JDialog не может быть изменен вручную по умолчанию.
Кроме того, я не могу найти, как выбрать заголовок (в отличие от отдельных ячеек). Я предполагаю, что мне нужно установить JTableHeader
заранее.
Наконец, я не вижу никакого метода, чтобы определить, какой столбец выбран. По крайней мере я нашел 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();
}
2 ответа
"[...] можно было бы выбрать столбец, щелкнув заголовок, установив JTableHeader".
Исходя из ваших требований, я не думаю, что вам нужно указывать собственный заголовок таблицы, а вместо этого прикрепите 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));
}
}
});
Примечание: не забудьте разрешить выбор столбцов.
Увидеть:
Вы можете получить значение выделенной ячейки, используя это. Но это право, которое вы хотите?
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);
}
}
});