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