gpt4 book ai didi

java - 使用事件处理程序时不会触发操作 - KeyListener

转载 作者:行者123 更新时间:2023-12-02 01:37:20 26 4
gpt4 key购买 nike

所以我是事件处理程序的新手,我想创建一个程序,在框架内制作一个紫色面板,如果用户单击面板区域中的鼠标按钮,然后用键盘输入%,我想让面板在面板区域内画一条线段。这只是测试事件处理程序。现在,我正在尝试,但它不起作用。所有帮助将不胜感激。在我掌握了这个之后,我想尝试一下 repaint() 方法,如果有人执行与以前相同的操作,我想检查面板的背景。如果你能在这两方面帮助我,那就太好了,但这不是优先事项。谢谢。

 import java.awt.Graphics;          // for classes Graphics, Color, Font, Image
import java.awt.Color;
import java.awt.Font;

import java.awt.event.KeyEvent; // for classes KeyListener, MouseListener
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame; // for classes JFrame, JPanel, JLabel
import javax.swing.JPanel;

public class GardenGrows
{
public GardenGrows()
{
}

public static void main(String[] args)
{
GardenGrows gg = new GardenGrows();
gg.runIt();
}

// makes the frame and handles all properties of the frame
// also instantiates the Garden.java object
public void runIt()
{
JFrame frame = new JFrame ("Garden");

frame.setDefaultCloseOperation( frame.EXIT_ON_CLOSE );
frame.setLayout(null);

frame.setBackground(Color.GRAY);
frame.setSize( 1200,700);
frame.setLocation( 50, 10);
frame.setResizable(true);
frame.setVisible(true);

Garden gar = new Garden();
frame.getContentPane().add(gar);


}

}

class Garden extends JPanel implements KeyListener, MouseListener
{
private boolean mouseClicked;
private boolean keyClicked;
private int xpos;
private int ypos;

public Garden()
{
mouseClicked = false;
keyClicked = false;
addKeyListener(this);
addMouseListener(this);

setBackground(Color.PINK);
setLocation(50,50);
setSize(1000,500);



}



public void mousePressed(MouseEvent evt)
{
int x = evt.getX();
int y = evt.getY();

if(x>=50 || x<=1050 && y<=50 || y>=550)
{
mouseClicked = true;
}
}
public void mouseClicked(MouseEvent evt){}
public void mouseReleased(MouseEvent evt){}
public void mouseEntered(MouseEvent evt){}
public void mouseExited(MouseEvent evt){}

public void keyReleased(KeyEvent evt){}
public void keyPressed(KeyEvent evt){}

public void keyTyped(KeyEvent evt)
{
int letter = evt.getKeyCode();
if (letter == 13)
{
keyClicked =true;
}
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);

if(keyClicked && mouseClicked)
g.drawLine(50,0,110,120);

}


}

最佳答案

让一个按键监听器在 JPanel 中工作不会那么简单,因为它不可聚焦。 (想想 JTextField,当您在其上写入文本时,它就会获得焦点)。因此,为了使这项工作有效,您必须 use KeyBindings 。实际上,从 JPanel 中删除 KeyListener 实现,并使用 KeyBindings。

public class GardenGrows {
public GardenGrows() {
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
// All swing applications must run on EDT Thread
GardenGrows gg = new GardenGrows();
gg.runIt();
});
}

// makes the frame and handles all properties of the frame
// also instantiates the Garden.java object
public void runIt() {
JFrame frame = new JFrame("Garden");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);

frame.setBackground(Color.GRAY);
frame.setSize(1200, 700);
frame.setLocation(50, 10);
frame.setResizable(true);
frame.setVisible(true);

Garden gar = new Garden();
frame.getContentPane().add(gar);

}

}

class Garden extends JPanel implements MouseListener {
private boolean mouseClicked;
private boolean keyClicked;
private int xpos;
private int ypos;

public Garden() {
mouseClicked = false;
keyClicked = false;
addMouseListener(this);

setBackground(Color.PINK);
setLocation(50, 50);
setSize(1000, 500);
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_5, KeyEvent.SHIFT_MASK),
"percentageClicked");
getActionMap().put("percentageClicked", new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
keyClicked = true;
repaint(); // Try to draw the line
}
});
}

public void mousePressed(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();

if (x >= 50 || x <= 1050 && y <= 50 || y >= 550) {
mouseClicked = true;
repaint(); // Try to draw the line
}
}

public void mouseClicked(MouseEvent evt) {
}

public void mouseReleased(MouseEvent evt) {
}

public void mouseEntered(MouseEvent evt) {
}

public void mouseExited(MouseEvent evt) {
}

public void paintComponent(Graphics g) {
super.paintComponent(g);

if (keyClicked && mouseClicked)
g.drawLine(50, 0, 110, 120);

}

}

关于java - 使用事件处理程序时不会触发操作 - KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55037898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com