0
時,我有:聚焦丟失更新的JDialog
- 一個
JTable
,嵌入JScrollPane
,包含項目的列表 - 一個
JPanel
,嵌入JDialog
,即顯示與選擇的項目信息
的代碼按預期工作(信息得到更新),除了JTable
失去焦點和JDialog
每次選擇改變時獲得焦點。所以我添加了一個table.requestFocusInWindow
,但JTable
仍然失去焦點,儘管該調用返回true。
我怎樣才能確保JDialog
得到更新,但JTable
沒有失去焦點?
ps:我的最終目標是能夠使用箭頭(上/下)瀏覽表格並查看JDialog中的信息更新 - 此刻,我需要點擊行才能做到這一點。
編輯
請參閱複製我的問題(當選擇改變的JDialog的內容發生改變,但焦點丟失)一SSCCE以下。
public class TestTable extends JTable {
public static JFrame f = new JFrame();
public static JTextField text = new JTextField();
public static JDialog dialog;
public static void main(String[] args) {
f.setSize(300, 300);
f.setLocation(300, 300);
f.setResizable(false);
showPopup();
final JScrollPane jScrollPane = new JScrollPane();
jScrollPane.getViewport().add(new TestTable());
f.add(jScrollPane);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public TestTable() {
super();
setModel(new TestTableModel());
getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
int row = lsm.getAnchorSelectionIndex();
Object item = getModel().getValueAt(row, 0);
text.setText(item.toString());
dialog.setVisible(true);
TestTable.this.requestFocusInWindow(); //DOES NOT DO ANYTHING
}
});
setCellSelectionEnabled(false);
}
public class TestTableModel extends DefaultTableModel {
public TestTableModel() {
super(new String[]{"DATA"}, 3);
setValueAt(Double.valueOf(-0.1), 0, 0);
setValueAt(Double.valueOf(+0.1), 1, 0);
setValueAt(Double.valueOf(0), 2, 0);
}
}
private static void showPopup() {
dialog = new JDialog(f, "Title");
dialog.setContentPane(text);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}
感謝您的答案 - 如果你有一秒鐘,我已經發布上面的SSCCE複製了這個問題。 – assylias
@assylias是的,我看到了。我只是複製它,似乎調用'f.toFront()'伎倆 –
其實主要的區別是,我調用'dialog.setVisible()'。如果我刪除那條線,我會得到預期的行爲。 – assylias