Как нарисовать в MouseListenerEvent? - PullRequest
1 голос
/ 28 февраля 2012

У меня есть следующий код:

        label.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                    Graphics g=image.getGraphics();
                    g.setColor(Color.YELLOW);

                    g.fillRect(0, 0, image.getWidth(), image.getHeight());
                }
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {}

            @Override
            public void mouseExited(MouseEvent arg0) {}

            @Override
            public void mousePressed(MouseEvent arg0) {}

            @Override
            public void mouseReleased(MouseEvent arg0) {}           
        });

изображение является объектом BufferedImage.Но когда я нажимаю на ярлык, он ничего не рисует.Я думаю, что есть проблема с потоками.Как я могу это исправить?Спасибо.

1 Ответ

3 голосов
/ 28 февраля 2012

Взаимодействие с объектом Graphics должно быть ограничено методом paintComponent.

Да, это проблема с потоками, но не совсем так, как вы думаете.

Все рисование выполняется в методе paint() компонента, который вызывает paintBackground, paintBorder и paintComponent. Вместо рисования области в событии обработчика мыши, вам нужно установить флаг и вызвать repaint() на панели или компоненте, на котором вы хотите нарисовать это.

Внутри этого компонента перезаписать метод paintComponent. Позвоните super.paintComponent() и нарисуйте, что хотите, когда флаг установлен.

Когда вы вызываете repaint() на панели, он помечает компонент, который будет окрашен. Затем метод paintComponent() будет вызван в следующий раз, когда поток обработки событий отобразит этот компонент. Это добавит ваш прямоугольник к вершине.

...