[英]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.