Проблема свинга, рисование на JTabbedPane
Я с трудом пытаюсь понять и решить проблему во время рисования на JPanel в JTabbedPane. В основном, у меня есть маленькое приложение, которое рисует графику статистики, это простой JFrame с JTabbedPane. Теперь JTabbedPane имеет 2 вкладки, каждая из которых содержит JPanel (расширенная), javax.swing.Timer запускается после нажатия кнопки запуска и рисует график на одном JPanel, каждую секунду - новую линию, пока что все хорошо. Если, пока таймер работает и рисует на панели, я выбираю другую вкладку (она все еще пуста), я вижу, что метод drawString начинает рисовать на выбранной панели, которая не содержит никакого вызова метода drawString, я вставлю соответствующий код:
public class Monitor extends JPanel{
**private Timer timer=new Timer(1000,new PerformanceEvent(this));**
public Monitor(){
this.setBackground(Color.BLACK);
this.setPreferredSize(new Dimension(400,211));
this.setBounds(new Rectangle(16,44,400,211));
this.setVisible(true);
}
/**
* This method contains the Graphoc tool to draw on the panel
* @param g
*/
public void analize(Graphics g){
if((ammountOfTimesAnalizeCalled / 10)==1){
g.setColor(Color.red);
g.drawLine(left1, high1, left2, high2);
//print high2 variable on file
Performance.report(high2);
prepareForNext();
ammountOfTimesAnalizeCalled++;
System.out.println(ammountOfTimesAnalizeCalled);
}
/**
* This method is used by the GUI to start the timer<br/>
* The timer starts and will calls analize
*/
public void start(){
timer.start();
}
/**
* This method stops the TimerTask
*/
public void stop(){
timer.stop();
}
}
Я не сообщил о функциональности метода анализа, потому что он длинный и неактуальный, все это делает drawString Здесь пустая панель, которая установлена на второй вкладке панели jtabbed, как вы можете видеть, она пока ничего не делает
public class Informations extends JPanel{
/**
* The constructor initializes the panel's appearence
*/
public Informations(){
this.setBackground(Color.BLACK);
this.setPreferredSize(new Dimension(400,211));
this.setBounds(new Rectangle(16,44,400,211));
this.setVisible(true);
}
}
JTabbedPane
public class MyPane extends JTabbedPane{
private Monitor monitor=new Monitor();
private Informations informations=new Informations();
public MyPane(){
monitor.setBounds(new Rectangle(5, 5, 400, 211));
this.setPreferredSize(new Dimension(420,250));
this.setBounds(new Rectangle(16,44,420,250));
this.setVisible(true);
this.addTab("Performance", monitor);
this.addTab("Informations", informations);
}
}
И это обработчик событий в таймере:
public class PerformanceEvent implements ActionListener{
private Monitor monitor=null;
public PerformanceEvent(Monitor monitor){
this.monitor=monitor;
}
/**
* Perform the drawing action
*/
public void actionPerformed(ActionEvent event) {
monitor.analize(monitor.getGraphics());
}
}
Надеюсь, у вас есть совет, спасибо
1 ответ
Ваша проблема действительно странная. Из приведенного выше кода все выглядит хорошо. Не могли бы вы проверить что-нибудь? Так как рисование происходит только внутри класса Monitor, который расширяет JPanel, тогда вместо того, чтобы бросать объект Graphics, попробуйте просто использовать Graphics g = getGraphics(); внутри метода analize() для получения объекта Graphics. Я не уверен, что это что-то решит, но кажется странным, что один класс передает другому класс, что у него уже есть.