最终目标:使用KeyListener创建随机形状(具有随机属性)。当按下其对应的键时,将显示一个新的随机形状(例如,圆圈为“ c”)。我必须使用2个类来实现此目的。 ShapeDriver处理形状的创建和绘制(在此实现了KeyListener接口)。 ShapeWindow创建一个ShapeDriver对象(它是一个JPanel),然后将其添加到JFrame中。
形状的创建和绘画工作正常,唯一的问题是添加KeyListener。
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Dimension;
public class ShapeDriver extends JPanel implements KeyListener {
public final int FRAME_WIDTH = 600;
public final int FRAME_HEIGHT = 600;
private Random random;
private ArrayList<Shape> shapes;
public JPanel panel;
public ShapeDriver() {
super();
random = new Random();
shapes = new ArrayList<Shape>();
panel = new JPanel();
panel.setSize(FRAME_WIDTH, FRAME_HEIGHT);
addKeyListener(this); //my best attempt at adding the KeyListener (which
doesn't work
this.add(panel);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Color fillColor = new Color(random.nextInt(255),
random.nextInt(255), random.nextInt(255));
Color borderColor = new Color(random.nextInt(255),
random.nextInt(255), random.nextInt(255));
int x = random.nextInt(255);
int y = random.nextInt(255);
shapes.add(new Hexagon(fillColor, borderColor, x,y));
for(Shape s : shapes)
{
System.out.println(s.toString());
s.draw(g);
}
}
public void keyPressed(KeyEvent e) {
System.out.println("keyPressed");
Color fillColor = new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255));
Color borderColor = new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255));
int x = random.nextInt(255);
int y = random.nextInt(255);
if(e.getKeyChar() == 'c')
{
shapes.add(new Circle(fillColor, borderColor, x, y));
}
else if(e.getKeyChar() == 'r')
{
shapes.add(new Rectangle(fillColor, borderColor, x, y));
}
else if(e.getKeyChar() == 'o')
{
shapes.add(new Oval(fillColor, borderColor, x, y));
}
else if(e.getKeyChar() == 's')
{
shapes.add(new Square(fillColor, borderColor, x, y));
}
else if(e.getKeyChar() == 't')
{
shapes.add(new Triangle(fillColor, borderColor, x, y));
}
else if(e.getKeyChar() == 'p')
{
shapes.add(new Parallelogram(fillColor, borderColor, x, y));
}
else if(e.getKeyChar() == 'h')
{
shapes.add(new Hexagon(fillColor, borderColor, x, y));
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) { }
@Override
public void keyTyped(KeyEvent e) { }
}
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
public class ShapeWindow extends JFrame {
JPanel shapeDriver;
public ShapeWindow() {
super();
JFrame frame = new JFrame();
final int FRAME_WIDTH = 400;
final int FRAME_HEIGHT = 400;
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setTitle("ShapeGenerator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
shapeDriver = new ShapeDriver();
frame.add(shapeDriver);
frame.setVisible(true);
}
public static void main(String[] args) {
JFrame shapeWindow = new ShapeWindow();
}
}
正确创建了JFrame,正确显示了ShapeDriver中未注释的形状,并且当我调整其大小时,框架正确地重新绘制(换句话说,KeyListener是唯一不起作用的东西)。
我们非常感谢您的协助。另外,我对此还不陌生,所以如果我格式化严重错误,请告诉我,谢谢!
答案 0 :(得分:0)
在addKeyListener()之后在ShapeDriver构造函数中添加以下内容-
this.setFocusable(true);
this.requestFocusInWindow();
引用this。