【问题标题】:Implementing a keylistener in one class to work with a jframe created in another class在一个类中实现 keylistener 以使用在另一个类中创建的 jframe
【发布时间】:2019-03-25 12:05:06
【问题描述】:

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

非常感谢任何帮助。另外,我是新手,所以如果我格式化了一些可怕的错误,请告诉我,谢谢!

【问题讨论】:

    标签: keylistener


    【解决方案1】:

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

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

    请参考this

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多