[英]Java KeyListener, trying to get a Color to change according to the key pressed
这是我第一次询问stackoverflow,所以请告诉我我做错了什么。
我正在编写一个实现按键侦听器的程序,并且试图使它根据按下的按键来更改颜色。 (请参见下面的代码)但是,它不会更改颜色,但仍会记录按键。 如代码中所示,我尝试使用“ b”键进行测试。 提前致谢。
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Spring extends JPanel implements KeyListener {
private char f = 'a';
private int a = 0, b = 0, c = 0;
private Color flower = new Color(a,b,c);
public Spring() { //Constructor
this.setPreferredSize(new Dimension(500, 500));
addKeyListener(this);
}
public void addNotify() { //the focus
super.addNotify();
requestFocus();
}
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight()); //clear before next press
g.drawString("the key that pressed is " + f, 0, 10);
g.setColor(flower);
Polygon flowa = new Polygon();
flowa.addPoint(220,270);
flowa.addPoint(250,300);
flowa.addPoint(270,270);
flowa.addPoint(250,300);
g.fillPolygon(flowa);
g.fillRect(250,300,30,30);
}
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) { //when key is typed, do something
f = e.getKeyChar(); //modify value of f
switch (f){
case 'a':
a = 10;
b = 10;
c = 10;
case 'b':
a = 223;
b = 45;
c = 45;
System.out.println("Bals");
case 'c':
a = 10;
b = 10;
c = 10;
case 'd':
a = 10;
b = 10;
c = 10;
case 'e':
a = 10;
b = 10;
c = 10;
case 'f':
a = 10;
b = 10;
c = 10;
case 'g':
a = 10;
b = 10;
c = 10;
case 'h':
a = 10;
b = 10;
c = 10;
case 'i':
a = 10;
b = 10;
c = 10;
case 'j':
a = 10;
b = 10;
c = 10;
case 'k':
a = 10;
b = 10;
c = 10;
case 'l':
a = 10;
b = 10;
c = 10;
case 'm':
a = 10;
b = 10;
c = 10;
}
repaint();
}
public static void main(String[] s) { //main method, creates the frame
JFrame f = new JFrame();
f.getContentPane().add(new Spring());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
您只需设置变量a
, b
和c
。 改变这些变量不会改变所使用的数字flower
,因为flower
是用你传递的数字,而不是你正在使用的变量。
您需要在每个实例中创建一个新的Color
对象,如下所示:
flower = new Color(20, 230, 210);
另外,别忘了添加break;
案件之间的界线; 否则,您的flower
对象将是您上次列出的颜色。
另外,您可能想使用KeyAdapter类的实现,该实现允许您仅定义要使用的方法而不是所有方法,而不是拥有自己的类KeyListener
。
saiarcot895的答案是正确的,因为它可以解决当前的问题(+1)。 这是一个如何使用Key Bindings API来实现的示例
通常, KeyListener
对于监视关键事件是一个糟糕的选择,因为它会遇到与焦点相关的问题,您正在尝试解决这些问题,但并不一定要使其正常工作。
更好的解决方案是使用Key Bindings API,它使您能够配置触发关键事件的焦点级别。
您将遇到的问题是,您有大量可能要使用的按键。 为此,我仅使用了一个Map
即可将关键代码映射到一个Action
,该Action
用来设置所需的颜色
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Spring extends JPanel {
private Color flower = Color.BLACK;
private String key;
public Spring() {
Map<Integer, ColorAction> mapColors = new HashMap<>(25);
mapColors.put(KeyEvent.VK_F, new ColorAction(this, "F", new Color(10, 10, 10)));
mapColors.put(KeyEvent.VK_B, new ColorAction(this, "B", new Color(223, 45, 45)));
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
for (Integer keyCode : mapColors.keySet()) {
KeyStroke ks = KeyStroke.getKeyStroke(keyCode, 0);
im.put(ks, ks);
am.put(ks, mapColors.get(keyCode));
}
}
public void update(String ks, Color color) {
flower = color;
key = ks;
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("the key that pressed is " + key, 0, 10);
g.setColor(flower);
Polygon flowa = new Polygon();
flowa.addPoint(220, 270);
flowa.addPoint(250, 300);
flowa.addPoint(270, 270);
flowa.addPoint(250, 300);
g.fillPolygon(flowa);
g.fillRect(250, 300, 30, 30);
}
public static void main(String[] s) { //main method, creates the frame
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame f = new JFrame();
f.getContentPane().add(new Spring());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
});
}
public class ColorAction extends AbstractAction {
private Spring spring;
private String key;
private Color color;
private ColorAction(Spring spring, String ks, Color color) {
this.spring = spring;
this.key = ks;
this.color = color;
}
@Override
public void actionPerformed(ActionEvent e) {
spring.update(key, color);
}
}
}
如果您认为有帮助,欢迎您投票,但saiarcot895答案应标记为正确
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.