在 Ubuntu 20.04 上嘗試過,以防萬一。
當存在多個 JTable,但您只需要查看最后一個選定 JTable 的最后一個用戶選擇的行(或單元格)時,您如何可靠地知道是哪一個?我已經嘗試過串列選擇偵聽器和焦點偵聽器,但是當您在兩個表中編輯一個單元格并且在相同的單元格之間移動時,所有這些都失敗了。例如,給定以下代碼:
package test;
import java.awt.FlowLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
public class TableRowSelect {
private String lastSelectedValue = "";
public TableRowSelect() {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Test row selection");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object[][] table1Data1 = new Object[][] {
new Object[] {
"1: Row1Col1", "1: Row1 Col2",
},
new Object[] {
"1: Row2 Col1", "1: Row2Col2",
},
};
Object[][] table1Data2 = new Object[][] {
new Object[] {
"2: Row1Col1", "2: Row1 Col2",
},
new Object[] {
"2: Row2 Col1", "2: Row2Col2",
},
};
Object[] columnNames1 = new Object[] {
"Col1", "Col2",
};
JButton button = new JButton("Show Row");
button.addActionListener((e) -> {
System.out.println("Value: " lastSelectedValue);
});
JTable table1 = new JTable(table1Data1, columnNames1);
setupTable(table1, 1);
JTable table2 = new JTable(table1Data2, columnNames1);
setupTable(table2, 1);
JScrollPane table1Pane = new JScrollPane(table1);
JScrollPane table2Pane = new JScrollPane(table2);
frame.setLayout(new FlowLayout());
frame.add(table1Pane);
frame.add(table2Pane);
frame.add(button);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
public static void main(String[] args) {
new TableRowSelect();
}
private void setupTable(JTable table, int tableNumber) {
table.getSelectionModel().addListSelectionListener((e) -> {
int selectedRow = table.getSelectedRow();
System.out.println("Selected a row in table " tableNumber ": " selectedRow);
if (!e.getValueIsAdjusting() && (selectedRow != -1)) {
lastSelectedValue = table.getModel().getValueAt(selectedRow, 0).toString();
}
});
table.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
System.out.println("Focused on a row in table " tableNumber);
int selectedRow = table.getSelectedRow();
if (selectedRow != -1) {
lastSelectedValue = table.getModel().getValueAt(selectedRow, 0).toString();
}
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("Lost focus on a row in table " tableNumber);
}
});
}
}
當您使用任何新內容編輯表 1、第 0 行、第 0 列,并且沒有按 Enter 鍵或單擊除表 2、第 1 行、第 0 列以外的其他位置并編輯該表時,當您回傳表 1、第 0 行、第 0 列時,您不會收到任何更改通知(選擇或焦點)。在編輯兩個單元格之間來回切換不會讓您知道當前正在編輯哪個單元格。上面的示例使用一個按鈕來列印單元格的內容,但它可以是對最后一個需要的選定單元格的任何型別的處理。
uj5u.com熱心網友回復:
您可以Component通過FocusListener在其上安裝 a來檢測編輯器上的焦點更改事件。
您可以Component像這樣安裝自己的編輯器(以便您可以訪問它的安裝):
final JTextField editorComp = new JTextField();
editorComp.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
System.out.println("Focus gained on editor component of table " tableNumber '.');
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("Focus lost from editor component of table " tableNumber '.');
}
});
table.setDefaultEditor(Object.class, new DefaultCellEditor(editorComp));
...或者,如果您希望在預安裝的編輯器上出現這種行為Component:
((DefaultCellEditor) table.getDefaultEditor(Object.class)).getComponent().addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
System.out.println("Focus gained on editor component of table " tableNumber '.');
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("Focus lost from editor component of table " tableNumber '.');
}
});
上述替代方法之一應該(通過復制粘貼)進入該setupTable方法。您可以選擇將該代碼與您的ListSelectionListener(安裝在 上ListSelectionModel)表結合起來。在FocusListener為宗旨直接放在桌子上本身似乎沒有必要。
另外,不要忘記改變第二次呼叫的第二個引數setupTable(應該是例如2,沒有1),否則使用getSource();的FocusEvent由接收FocusListener(主編的Component)方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/407431.html
標籤:
