Правильное использование метода repaint ()

1

У меня есть кнопка, которая при нажатии вызывает метод changecolor() в другом классе, где выполняется какой-либо чертеж. Слушатель кнопки работает нормально, и я вижу, что некоторые изменения в журнале были изменены, но мой рисунок не обновлен. Это моя текущая реализация:

(Этот метод вызывается при нажатии кнопки)

public void changeWarningLightColor(){
    System.out.println("change color method called");
    if(warningLights.equals(Color.GREEN)){
        warningLights=Color.RED;
        System.out.println(warningLights);
        repaint();  
    }
    else{
        warningLights=Color.GREEN;
        repaint();  
    }
}

и мой чертеж создается в том же файле в вышеуказанном методе следующим образом:

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
            g.drawSomething();
            //draw a bunch of lines
}

Мой вопрос в том, что является правильным способом вызвать repaint(), чтобы фактически обновить чертеж? Нужно ли мне как-то вызвать g.repaint() или сделать что-то другое?

Разделяйте класс, в котором создается фрейм:

public class MainWindow extends JFrame {

public MainWindow(){
    JPanel Window = new JPanel(); 
    JPanel LeftSidePanel = new JPanel();
    LeftSidePanel.setLayout(new BorderLayout());

    LeftSidePanel.add(new DrawStatus(),BorderLayout.CENTER); //where the drawing is added

    Window.setLayout(new BoxLayout(Window,0));
    Window.add(LeftSidePanel);

    add(Window);    

}

public static void main(String[] args)  {
    //main method for showing the frame we created with the panels, and circles inside it 
    MainWindow frame = new MainWindow();
    frame.setSize((int) (.75*Toolkit.getDefaultToolkit().getScreenSize().getWidth()),(int) (.75*Toolkit.getDefaultToolkit().getScreenSize().getHeight()));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.setTitle("DVPWS v1.0");
    frame.setResizable(false);

    MenuBar menu = new MenuBar();
    frame.setJMenuBar(menu);
    frame.setVisible(true);


}



}
Теги:
swing
paintcomponent
repaint

2 ответа

1

Если вы используете Jframe (скорее всего),

    yourFrame.repaint();

Необязательно

    yourPanel.repaint();
  • 0
    Разве не имеет смысла делать это с панели?
  • 0
    Я всегда видел, как это делается, из кадра, но я думаю, что это происходит в обоих направлениях.
Показать ещё 15 комментариев
0

В этом случае вы могли бы сделать

    public MainWindow mw = new MainWindow();

    mw.repaint();

Если это не работает (у меня была аналогичная проблема), чем вам понадобится сделать экземпляр JFrame вместо его продолжения.

  • 0
    Кажется, что если я пытаюсь создать новый объект MainWindow, я получаю ошибку переполнения стека.
  • 0
    Ошибка Stackoverflow при компиляции

Ещё вопросы

Сообщество Overcoder
Наверх
Меню