私は持っている:
- アイテムのリストを含むに
JTable
埋め込まれたJScrollPane
- に
JPanel
埋め込まれJDialog
、選択したアイテムに関連する情報を表示する
選択が変更されるたびに がJTable
フォーカスを失い、 がフォーカスを取得することを除いて、コードは期待どおりに動作します (情報が更新されます) 。JDialog
だから私は追加しましたが、呼び出しはtrueを返しますtable.requestFocusInWindow
が、JTable
まだフォーカスを失います。
JDialog
が更新されJTable
、フォーカスが失われないようにするにはどうすればよいですか?
ps: 私の最終的な目標は、矢印 (上/下) でテーブルを参照し、JDialog で情報の更新を確認できるようにすることです。現時点では、行をクリックしてそれを行う必要があります。
EDIT
私の問題を再現するSSCCEの下を参照してください(選択が変更されたときにJDialogの内容が変更されますが、フォーカスが失われます)。
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);
}
}