JPanel Графика очистка и перекраска? - PullRequest
8 голосов
/ 01 августа 2011

У меня есть JPanel с функцией paintComponent().Я вызову его один раз, затем, когда пользователь щелкнет по другому JButton, я установлю какой-нибудь флаг и захочу снова вызвать эту функцию, поскольку она будет делать что-то немного другое после того, как этот флаг установлен.

Итак, вот что мне интересно: как я могу удалить существующий материал из paintComponent?И чтобы перерисовать, я просто позвоню paintComponent снова?

В настоящее время я пытаюсь сделать следующее:

flag2 = true;
repaint(); //I expect (want) paintComponent to be called again

В компоненте рисования я делаю что-то вроде:

if (flag2==true) {
    g.drawRect(...);
} else {
    g.drawLine(...);
}

Но при тестировании кажется, что что-то естьнеправильно с тем, что я делаю.

Спасибо за любую помощь.

Ответы [ 4 ]

15 голосов
/ 01 августа 2011

Когда вы изменяете свойство панели, вам нужно вызвать:

panel.repaint();

чтобы перекрасить компонент.

Тогда первый оператор в методе paintComponent () должен быть:

super.paintComponent(g);

Это закрасит фон, так что теперь вы можете делать свои собственные рисунки.

Если вам нужна дополнительная помощь, опубликуйте SSCCE , который демонстрирует проблему.

13 голосов
/ 01 августа 2011

Чтобы очистить всю ранее нарисованную графику, вызовите g.clearRect(0, 0, getWidth(), getHeight()).

2 голосов
/ 02 августа 2011

Я бы предложил вызвать revalidate (); вместо repaint (). revalidate () необходимо вызывать при изменении размера / макета или когда вы добавляете / удаляете объекты на jpanel и обновляете все его дочерние элементы. Насколько я могу судить, вы все еще используете тот же объект рисования, но меняете его расположение.

2 голосов
/ 01 августа 2011

Во-первых, почему бы не использовать перечисление вместо логического?

enum Enum { 
    RECTANGLE,
    LINE,
    CIRCLE
}

Enum choice = RECTANGLE; //default to RECTANGLE

switch(choice) { 
   // case RECTANGLE, LINE, CIRCLE
}

Что касается вашей проблемы, можете ли вы ответить на мои комментарии в вашем вопросе?

...