5

JPanelを右クリックするとポップアップメニューを開くJavaプログラムがあります。ポップアップメニュー項目のいずれかがクリックされたときに、ターミナルでポップアップメニューをトリガーした右クリックの場所を印刷したいと思います。どうすればよいですか?ポップアップアクションイベント内から右クリックが発生した場所を取得するにはどうすればよいですか?

ポップアップメニューがJComponentにある場合、コードはどのように変わりますか?

これがプログラムです。

    import java.awt.EventQueue;
    import java.awt.event.*;
    import javax.swing.*;

    public class MenuTest
    {
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    MenuFrame frame = new MenuFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }
    }

    class MenuFrame extends JFrame
    {
        public MenuFrame()
        {
            setTitle("MenuTest");
            setSize(300, 200);

            Action cutAction = new TestAction("Cut");
            Action copyAction = new TestAction("Copy");
            Action pasteAction = new TestAction("Paste");

            JPopupMenu popup = new JPopupMenu();
            popup.add(cutAction);
            popup.add(copyAction);
            popup.add(pasteAction);

            JPanel panel = new JPanel();
            panel.setComponentPopupMenu(popup);
            add(panel);

            panel.addMouseListener(new MouseAdapter() {});
        }

        class TestAction extends AbstractAction
        {
            public TestAction(String name)
            {
                super(name);
            }

            public void actionPerformed(ActionEvent event)
            {
                System.out.println("Right click happened at ?"); // How do I get right click location?          
            }
        }
    }
4

4 に答える 4

4

押されたイベントにマウスリスナーを追加します(クリックされたイベントはポップアップによってキャプチャされます):

    panel.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            clickLocation.setSize(e.getX(), e.getY());
        }
    });
    Action cutAction = new TestAction("Cut", clickLocation);
    Action copyAction = new TestAction("Copy", clickLocation);
    Action pasteAction = new TestAction("Paste", clickLocation);

寸法を印刷します。

    private Dimension clickLocation;

    public TestAction(String name, Dimension clickLocation) {
        super(name);
        this.clickLocation = clickLocation;
    }

    public void actionPerformed(ActionEvent event) {
        System.out.println("Right click happened at " + clickLocation);
    }
于 2012-12-01T16:57:44.393 に答える
3

あなたは正しい軌道に乗っていました。個人的にはMouseAdapter、他のマウスイベントにメソッドを追加できるように手動で表示することを好みます。このためには、おそらく削除する必要がありますpanel.setComponentPopupMenu(popup);


panel.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent arg0) {
            if (arg0.getButton() == MouseEvent.BUTTON3) { //Button3 is rightclick
                popup.show(panel, arg0.getX(), arg0.getY());
            }
        }
});
于 2012-12-01T16:29:00.313 に答える
0

これが私が探していたコードです。スキッパーキとギャレットにご協力いただきありがとうございます。

    import java.awt.EventQueue;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.geom.*;

    public class MenuTest
    {
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    MenuFrame frame = new MenuFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }
    }

    class MenuFrame extends JFrame
    {
        public MenuFrame()
        {
            setTitle("MenuTest");
            setSize(300, 200);

            Action cutAction = new TestAction("Cut");
            Action copyAction = new TestAction("Copy");
            Action pasteAction = new TestAction("Paste");

            JPopupMenu popup = new JPopupMenu();
            popup.add(cutAction);
            popup.add(copyAction);
            popup.add(pasteAction);

            JPanel panel = new JPanel();
            panel.setComponentPopupMenu(popup);
            add(panel);

            panel.addMouseListener(new MouseAdapter() { 
                @Override
                public void mousePressed(MouseEvent e) {
                    clickLocation= e.getPoint();
                }
            });
        }

        class TestAction extends AbstractAction
        {
            public TestAction(String name)
            {
                super(name);
            }

            public void actionPerformed(ActionEvent event)
            {
                System.out.println("Right click happened at (" + clickLocation.getX()+"," + clickLocation.getY()+ ")");         
            }
        }

        private Point2D clickLocation;
    }
于 2012-12-01T23:52:28.013 に答える
0

または、イベントから取得したくない場合。

Point mousepospoint=null;

if((mousepospoint=componentname.getMousePosition()) != null){
//mouseposArray[0]=mousepospoint.x;
//mouseposArray[1]=mousepospoint.y;
mousepoints(mousepospoint.x,mousepospoint.y);
}//enif


int[] mouseposArray={0,0};
// requires a function to return it if mouseposArray[] is global
protected int[] mousepoints(int xpo,int ypo){
mouseposArray=new int[2];
mouseposArray[0]=xpo;
mouseposArray[1]=ypo;
return mouseposArray;
}//enmeth 
于 2012-12-02T00:38:46.300 に答える