У меня есть кнопка, которая при нажатии вызывает метод 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);
}
}
Если вы используете Jframe (скорее всего),
yourFrame.repaint();
Необязательно
yourPanel.repaint();
В этом случае вы могли бы сделать
public MainWindow mw = new MainWindow();
mw.repaint();
Если это не работает (у меня была аналогичная проблема), чем вам понадобится сделать экземпляр JFrame вместо его продолжения.