Generalnie zarys programu wygląda tak, że do pewnego zbioru danych dostarczam dane co jakiś czas (czytam temperaturę z RS-a). Klasa przechowująca dane za każdym razem gdy dane się zmieniają powiadamia o tym swoich zarejestrowanych słuchaczy. U mnie słuchaczem jest klasa rozszerzająca JPanel. Po zmianie danych procedura obsługi zdarzenia wywołuje metodę repaint(). Metoda paintComponent panelu wywoływana jest tylko raz: zaraz po starcie programu. Wywoływanie repaint() nie powoduje wywołania metody paintComponent...
Przedstawiam fragmenty kodu:
Procedura obsługi zdarzenia w klasie JPanel:
public void chartDataChanged(ChartDataModelEvent event) {
// TODO Auto-generated method stub
System.out.println("Dostałem dane!");
coordSys = new CoordinateSystem(chart.getDataModel(), chartMargins, dimension);
chart.setCoordSystem(coordSys);
//chart = new DefaultChart(chartData, chartMargins, "Tytul", dimension);
chart.addChartRenderer(new PointCharRenderer(chart.getDataModel(), coordSys, chartMargins, dimension));
repaint();
System.out.println("Ostatnie wsp: "+chart.getChartRenderer().getDataModel().getXvalueAt(
chart.getChartRenderer().getDataModel().getDataLength()-1)+" "+
chart.getDataModel().getYvalueAt(chart.getDataModel().getDataLength()-1));
System.out.println("Wielkosc: "+chart.getDataModel().getDataLength());
}
Ramka z panelem
import javax.swing.JFrame;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import pwr.wykres.event.*;
public class TestFrame1 {
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
fr = new TestFrame();
JFrame frame = new TestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
}
});
}
public static TestFrame fr;
}
class TestFrame extends JFrame
{
public TestFrame()
{
rs = new RS(this);
rs.searchForPorts();
rs.connect();
if (rs.getConnected() == true)
{
System.out.println("Udalo sie otwirzyc");
if (rs.initIOStream() == true)
{
rs.initListener();
}
}
setTitle("Test");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
getContentPane().setLayout(null);
wykrPanel = new WykresPanel1();
//component.setOpaque(false);
wykrPanel.setBackground(Color.WHITE);
//add(new AlphaContainer(wykrPanel));
add(wykrPanel);
}
public WykresPanel1 getWykrPanel(){
return wykrPanel;
}
public RS getRS(){
return rs;
}
WykresPanel1 wykrPanel;
RS rs;
private static final int DEFAULT_WIDTH = 600;
private static final int DEFAULT_HEIGHT = 400;
}
Dodam, że po dodaniu danych zdarzenia są przesyłane. Słuchacz je odbiera i przetwarza. Jedyne co nie działa to metoda repaint()... W przypadku stałych danych punkty na wykresie są rysowane poprawnie, więc ten element działa.
Kod jest wynikiem dużej liczby zmian koncepcji więc z pewnością jest kiepskiej jakości.
Z góry dziękuję za pomoc
repaint
. Przynajmniejthis.repaint()
lubcoś.repaint()
.