Здравствуйте, у меня есть 3 отдельных класса, один для фрейма, один для панели и один для keyListener
Всякий раз, когда я нажимаю стрелку влево, я хочу, чтобы он что-то напечатал на рамке. Я использовал getGraphics (), но я прочитал, что это плохая практика, и я не уверен, как это сделать правильно.
Я прочитал учебник по: https://docs.oracle.com/javase/tutorial/uiswing/painting/index.html
"Метод paintComponent - это то, где все ваши собственные рисунки занимают
место. Этот метод определяется javax.swing.JComponent, а затем
переопределены вашими подклассами для обеспечения их собственного поведения. "
Итак, я попытался расширить класс DrawingBoard в моем KeyboardListener
но в методе keyPressed я не знаю, как вызвать paintCompoment (Graphics g), что я могу указать в качестве параметра, и это правильный подход здесь?
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new UserInterface());
}
}
public class UserInterface implements Runnable {
private JFrame frame;
private DrawingBoard drawingBoard;
@Override
public void run() {
// TODO Auto-generated method stub
frame = new JFrame("");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
createComponents(frame.getContentPane());
addListener();
frame.pack();
frame.setVisible(true);
}
public void createComponents(Container container) {
drawingBoard = new DrawingBoard();
container.add(drawingBoard);
}
public void addListener() {
frame.addKeyListener(new KeyboardListener(drawingBoard));
}
}
public class DrawingBoard extends JPanel {
public Dimension getPreferredSize() {
return new Dimension(250, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}
}
public class KeyboardListener extends DrawingBoard implements KeyListener {
private DrawingBoard drawingBoard;
public KeyboardListener(DrawingBoard drawingBoard) {
this.drawingBoard = drawingBoard;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Hello", 50, 50);
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
// How do I call paintComponent
// What do I put as a parameter ?
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}