Конечная цель: использовать 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 - единственная вещь, которая не работает).
Любая помощь очень ценится.Кроме того, я новичок в этом, так что если я отформатировал что-то ужасно неправильно, дайте мне знать, спасибо!