Реализация кейлистера в одном классе для работы с jframe, созданным в другом классе - PullRequest
0 голосов
/ 21 октября 2018

Конечная цель: использовать 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 голосов
/ 21 октября 2018

Добавьте ниже в конструкторе ShapeDriver после addKeyListener () -

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

См. это .

...