在一个 class 中实现 keylistener 以与在另一个 class 中创建的 jframe 一起工作
Implementing a keylistener in one class to work with a jframe created in another class
最终目标:使用 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 是唯一不起作用的东西)。
非常感谢任何帮助。另外,我是新手,所以如果我格式化了一些可怕的错误,请告诉我,谢谢!
在 ShapeDriver 构造函数的 addKeyListener() 之后添加以下内容 -
this.setFocusable(true);
this.requestFocusInWindow();
参考this.
最终目标:使用 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 是唯一不起作用的东西)。
非常感谢任何帮助。另外,我是新手,所以如果我格式化了一些可怕的错误,请告诉我,谢谢!
在 ShapeDriver 构造函数的 addKeyListener() 之后添加以下内容 -
this.setFocusable(true);
this.requestFocusInWindow();
参考this.