在一个类中实现一个关键侦听器,以与在另一个类中创建的jframe一起使用

时间:2018-10-21 03:53:55

标签: keylistener

最终目标:使用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是唯一不起作用的东西)。

我们非常感谢您的协助。另外,我对此还不陌生,所以如果我格式化严重错误,请告诉我,谢谢!

1 个答案:

答案 0 :(得分:0)

在addKeyListener()之后在ShapeDriver构造函数中添加以下内容-

this.setFocusable(true);
this.requestFocusInWindow();

引用this

相关问题