Проблема с качанием, рисование на JTabbedPane - PullRequest
1 голос
/ 28 ноября 2011

Мне трудно понять и решить проблему, когда я рисую на 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 Ответ

0 голосов
/ 07 декабря 2013

Ваша проблема действительно странная. Из приведенного выше кода все выглядит хорошо. Не могли бы вы проверить что-нибудь, хотя? Так как рисование происходит только внутри класса Monitor, который расширяет JPanel, тогда вместо того, чтобы бросать объект Graphics, попробуйте просто использовать Graphics g = getGraphics (); внутри метода analize () для получения объекта Graphics. Я не уверен, что это что-то решит, но кажется странным, что один класс передает другому класс, что у него уже есть.

...