1

ユーザーがアプリケーションのテーブル行を右クリックしたときに、小さなコンテキストメニューを表示したいと思います。私の計画は、メソッドMouseListenerを呼び出すカスタムメイドを使用することでした。show()これが私のコードです:

import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

class TableMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
    JTable table = (JTable)(e.getSource());
    Point p = e.getPoint();
    int row = table.rowAtPoint(p);
    int col = table.columnAtPoint(p);

// The autoscroller can generate drag events outside the Tables range.
if ((col == -1) || (row == -1)) {
        return;
}

    if (SwingUtilities.isRightMouseButton(e)) {
        JPopupMenu pop = new JPopupMenu("Row "+row);
        JMenuItem menu1 = new JMenuItem("Wijzigen");
        menu1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                //do things, still have to make that
            }
        });
        pop.show(menu1, p.x, p.y);

    }
}
}

今私の問題は次のとおりです。アプリケーションを実行し、テーブルの行を右クリックすると、次のエラーが表示されます。

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Unknown Source)
at java.awt.Component.getLocationOnScreen(Unknown Source)
at javax.swing.JPopupMenu.show(Unknown Source)
at TableMouseListener.mousePressed(TableMouseListener.java:34)

ここで何が問題になっていますか?

4

2 に答える 2

4

JMenuItem(menu1)コンポーネントに対してJPopupMenu(pop)を表示しようとしています。ただし、popupmenuメソッドを呼び出した時点ではJMenuItemは表示されずshow、画面上のJMenuItemの場所を特定できません(もちろん、画面にはまだ表示されていません)。

ポップアップメニューメソッドの表示コンポーネントをshow最初の引数として使用する必要があります(たとえば、表示されたフレームに追加されるボタンやその他の実際に表示されるコンポーネント)。nullを渡して、ポップアップメニューを(0; 0)座標(画面の左上隅)に対して相対的に配置することもできます。

于 2012-10-31T15:24:05.653 に答える
2
  • JMenuItemに追加されていない場合はJPopupJMenuItemisDisplayable

  • このコンテナを準備します。オンザフライで作成しないでください。

  • ポップアップコンテナ全体をローカル変数として、またはクラスからの戻り値、voidなどとして作成します

    JMenuItemsa)も準備する

    b)オーバーライドmaybeShowPopupすると、そこで何でも管理できます(EDTで実行する必要があります)

  • 重要なメソッドの残り

于 2012-10-31T16:19:42.660 に答える