簡體   English   中英

如何在不使用按鈕的情況下單擊JFrame的內部框架

[英]How to click in an internal frame of JFrame, without using a button

我目前正在使用內部框架制作應用程序,並且我不想在內部框架中使用按鈕。 我希望它了解我單擊的位置(特定坐標),並根據單擊的位置完成操作。

這是我當前試圖讓他單擊鼠標進行注冊的內部框架之一。

package com.xxemu.main;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;

public class Techni extends JInternalFrame implements InternalFrameListener, MouseListener {

    private static final long serialVersionUID = -7905672790566329537L;
    static int openFrameCount = 0;
    private ImageIcon image;
    private JLabel label;
    private Menu menu;
    public int frame = 1;
    static final int xOffset = 75, yOffset = 90;

    public Techni() {
        super("emu",
        true, //resizable
        true, //closable
        true, //maximizable
        true); //iconifiable
        //setSize(783, 522);
        setSize(400, 400);

        setLocation(xOffset, yOffset);
    }
    public void setLayeredPane(JLayeredPane layered) {
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.out.println("asdfsd");
                if (e.getX() < 0 && e.getY() > 0) {
                    System.out.println("test");
                }

            }
        });
    }@Override
    public void internalFrameActivated(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameClosed(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameClosing(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameDeactivated(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameDeiconified(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameIconified(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameOpened(InternalFrameEvent arg0) {}@Override
    public void mouseEntered(MouseEvent e) {}@Override
    public void mouseExited(MouseEvent e) {}@Override
    public void mousePressed(MouseEvent e) {}@Override
    public void mouseReleased(MouseEvent e) {}@Override
    public void mouseClicked(MouseEvent e) {}
}

模擬器類

package com.xxemu.main;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;


public class Emulator extends JFrame implements ActionListener {


    private static final long serialVersionUID = 1922575930226682951L;
    JDesktopPane desktop;
    private boolean running = true;
    private Menu menu;
    private Techni techni;

    public enum STATE {
        techniMenu,
        p5Menu,
    };

    public static STATE emuState = null;

    public Emulator() {
        super("Emu");
        int inset = 50;
        setBounds(inset, inset,
        1000,
        800);

        desktop = new JDesktopPane();

        setContentPane(desktop);
        setJMenuBar(createMenuBar());

    }

    protected JMenuBar createMenuBar() {
        JMenuBar menuBar = new JMenuBar();

        //Set up the lone menu.
        JMenu menu = new JMenu("Options");
        menu.setMnemonic(KeyEvent.VK_O);
        menuBar.add(menu);

        //Set up the first menu item.
        JMenuItem menuItem = new JMenuItem("Technicolor");
        menuItem.setMnemonic(KeyEvent.VK_N);
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
        KeyEvent.VK_T, ActionEvent.ALT_MASK));
        menuItem.setActionCommand("techni");
        menuItem.addActionListener(this);
        menu.add(menuItem);

        //Set up the second menu item.
        menuItem = new JMenuItem("P5");
        menuItem.setMnemonic(KeyEvent.VK_N);
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
        KeyEvent.VK_P, ActionEvent.ALT_MASK));
        menuItem.setActionCommand("p5");
        menuItem.addActionListener(this);
        menu.add(menuItem);

        //Set up the third menu item.
        menuItem = new JMenuItem("Quit");
        menuItem.setMnemonic(KeyEvent.VK_Q);
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
        KeyEvent.VK_Q, ActionEvent.ALT_MASK));
        menuItem.setActionCommand("quit");
        menuItem.addActionListener(this);
        menu.add(menuItem);

        return menuBar;
    }

    //React to menu selections.
    public void actionPerformed(ActionEvent e) {
        if ("techni".equals(e.getActionCommand())) { //new
            emuState = STATE.techniMenu;
            System.out.println("testasdfas");
            createFrameTechni();
        } else if ("p5".equals(e.getActionCommand())) { //new
            createFrameP5();
        } else {
            quit();
        }
    }

    //Create a new internal frame.
    protected void createFrameTechni() {
        Techni frame = new Techni();
        frame.setVisible(true);
        desktop.add(frame);
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {}
    }
    protected void createFrameP5() {
        P5 frame = new P5();
        frame.setVisible(true);
        desktop.add(frame);
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {}
    }
    public synchronized void start() {
        if (running) return;
        running = true;
    }

    protected void quit() {
        System.exit(0);
    }

    public void run() {
        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int updates = 0;
        int frames = 0;
        while (running) {
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                tick();
                updates++;
                delta--;
            }

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("FPS: " + frames + " TICKS " + updates);
                frames = 0;
                updates = 0;
            }
        }
        stop();
    }
    private void tick() {
        menu.tick();
    }
    public synchronized void stop() {

    }

    private static void createAndShowGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);

        Emulator frame = new Emulator();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }


}

您可以將MouseListener添加到Component實例,該實例具有帶有x和y坐標的mouseClicked事件。

例:

component.addMouseListener(new MouseAdapter() {

    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int xOnScreen = e.getXOnScreen();

        int y = e.getY();
        int yOnScreen = e.getYOnScreen();
    }

});

我有一種編寫GUI時使用的方法,該GUI在框架內顯示鼠標坐標。

private static void debugMousePosition(JFrame frame) {
    final JFrame box = new JFrame("Mouse Position");
    box.setAlwaysOnTop(true);
    box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    box.setLocation(frame.getX() + 800,frame.getY());
    box.setSize(300, 100);
    box.setLayout(new GridLayout(1,2));
    box.setVisible(true);
    final JLabel X = new JLabel();
    final JLabel Y = new JLabel();
    frame.addMouseMotionListener(new MouseAdapter() {
        public void mouseMoved(MouseEvent me) {
            X.setText(String.valueOf("X Position: " + me.getX()));
            Y.setText(String.valueOf("Y Position: " + me.getY()));
            box.repaint();
        }
    });
    box.add(X);
    box.add(Y);

}

您將要監視的幀傳遞給debugMousePosition()方法。

似乎您想使用MouseActionListener來查看用戶單擊的時間,然后onClick將從MouseMotionListener獲得鼠標信息。 所以像

frame.addMouseListener(new MouseAdapter(){

   @Override
   public void mouseClicked(MouseEvent e)
   {
       if(e.getX() == someVariable && e.getY() == anotherVariable)
       {
          do something here
       }
   }
});

如果需要更多功能,例如當鼠標離開框架時,請查看MouseAdapter()類以查看其具有的其他方法。

在實現諸如InternalFrameListener之類的類時, 需要覆蓋其中包含的方法。 代替此,嘗試僅導入適配器版本,並在需要它們時從中創建一個新適配器。 就像我上面的代碼一樣,您將對InternalFrameAdapter進行類似的操作。

這是我建議您的班級看起來的樣子:

package com.xxemu.main;
import java.awt.Menu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;

public class Techni extends JInternalFrame
{

    private static final long serialVersionUID = -7905672790566329537L;
    static int openFrameCount = 0;
    private ImageIcon image;
    private JLabel label;
    private Menu menu;
    public int frame = 1;
    static final int xOffset = 75, yOffset = 90;

    public Techni()
    {
        super("emu",
              true, //resizable
              true, //closable
              true, //maximizable
              true);//iconifiable
        //setSize(783, 522);
        setSize(400, 400);

        setLocation(xOffset, yOffset);
    }

    public void setLayeredPane(JLayeredPane layered)
    {
        addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                System.out.println("asdfsd");
                if (e.getX() < 0 && e.getY() > 0)
                {
                    System.out.println("test");
                }

            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM