Как нарисовать что-то из KeyPressed без использования GetGraphics () - PullRequest
0 голосов
/ 06 ноября 2018

Здравствуйте, у меня есть 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
    }
}
...