0

JDialogマウスとキーのアクションに応答するを作成したかったのです。ダイアログには、彼にレコードを選択してもらいたい jTable が含まれています。彼は、ダブルクリックするか、キー (「2」など) を押すことで、それを選択できるはずです。

だから私はこれから始めました:

public showDialog(TableModel model) {
    super(new JFrame(), "Please select a record..."); 
    table = new JTable(model);

    //add JTable with ScrollPane
    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setPreferredSize(new Dimension(800, Math.min(table.getPreferredSize().height+60, 800)));
    scrollPane.getViewport().add(table);
    add(scrollPane);

    //display
    setAlwaysOnTop(true);
    toFront();
    pack();
    setVisible(true);

    //mouse
    table.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            System.out.println("clicked");
        }
    });

    //keys
    table.addKeyListener(new KeyAdapter() {

        @Override
        public void keyTyped(java.awt.event.KeyEvent evt) {}

        @Override
        public void keyReleased(java.awt.event.KeyEvent evt) {}

        @Override
        public void keyPressed(java.awt.event.KeyEvent evt) {
            System.out.println(evt.getKeyChar() + " pressed");
        }
    });
}

これは問題なく動作します。

ただし、ステートメントで同じことを行うとsetModal(true);、リスナーは機能しなくなります。

リスナーの機能を失わずに JDialog をモーダルにするにはどうすればよいですか?

4

3 に答える 3

3

簡単な解決策: JDialog がモーダルの場合、setVisible() は現在のスレッド、つまりダイアログのコンストラクターをブロックします。したがって、リスナーが追加されることはありません (実際には、ダイアログが閉じられている場合のみ)。したがって、イベントはありません。

解決策: 'setVisible(true);' を設定します。CTORの最後まで

ところで、「void showTheDialog();」のような追加のメソッドを使用して、CTOR でモーダル ロックを行うべきではありません。優れている。最初からこれを行っていれば、リスナーがそこにいて、すべてが機能していたはずです ;-) 編集: または、Factory メソッドのようなものを使用すると、さらに優れています。

ところで、命名規則に固執してください。「public showDialog(TableModel model) {」でメソッドの戻り値の型を忘れていないことを理解するのに10秒かかりましたが、これは実際にはCTOR自体でした:-)

于 2013-01-04T12:58:37.710 に答える
2
  • removeMouseListenerはあなたの目標には役に立たない

  • removeKeyListenerはあなたの目標には役に立たない

  • 適切なListSelectionModeを設定しますJTable

  • ListSelectionListenerを追加JTable

于 2013-01-04T13:03:32.423 に答える
2

これは問題を引き起こす可能性があると思います:

super(new JFrame(), "Please select a record...");

新しい を作成する理由はJFrame、既存のものを指定する必要があるためです。

ところで、他のメソッドではなく、superを拡張するクラスのコンストラクターで呼び出す必要があります。JDialog

于 2013-01-04T12:47:55.743 に答える