を更新する際に私が持っている:フォーカスが失われたJDialogの
- アイテムのリストを含む
JScrollPane
に埋め込まJTable
、選択された項目に関連する情報を表示JDialog
に埋め込ま JPanel
、
コードはJTable
がフォーカスを失って、JDialog
が焦点に選択が変更されるたびに取得することを除いて、期待どおりに動作(情報が更新されます)。だから、私はtable.requestFocusInWindow
を追加しましたが、JTable
は依然としてフォーカスを失いますが、呼び出しはtrueを返します。
JDialog
は更新されますが、JTable
はフォーカスを失わないことを確認するにはどうすればよいですか?
ps:私の最終目標は、矢印(上/下)でテーブルをブラウズし、JDialogで情報の更新を見ることです。現時点では、行をクリックする必要があります。
は私の問題を(選択が変更されたときに使って、JDialogの内容は変わりますが、フォーカスが失われた)複製SSCCE下記参照EDIT。
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);
}
}
ありがとう:
(フォーカスをつかむあなたのダイアログで何かがあることを自分自身を納得させるために、ラベルにgrabFocusコメント)このコードを参照してください。上記のSSCCEが問題を再現します。 – assylias
@assyliasはい私はそれを見た。私はちょうどそれをコピーし、 'f.toFront()'を呼び出すことはそのように思えるようです –
実際には主な違いは 'dialog.setVisible()'です。私がその行を削除すると、私は期待される動作を得ます。 – assylias