正如你建议我改写我的问题。这是我的问题。我有框架,增加了2个面板。在第一个面板中,我创建了一个Generator
对象。在类Generator
中,我有对象列表和计时器,它调用函数addItem()
,它将新对象添加到我的列表中。第二个面板(在框架中创建)需要打印我的数组中包含的对象列表。如果这些阵列会改变,那么这个面板需要自动修复。如果看起来太混乱,请查看代码片段
使用JFRAME CLASS
public class MainFrame extends JFrame{
private MapaSwiata mapa;
private MyPanel myPanel;
public MainFrame(){
//....
JPanel panel = new JPanel(new BorderLayout());
this.getContentPane().add(panel);
mapa = new MapaSwiata();
myPanel = new MyPanel();
panel.add(mapa,BorderLayout.CENTER);
panel.add(menu,BorderLayout.EAST);
//...
}
使用在JFrame类
中创建的第一个面板进行CLASSpublic class MapaSwiata extends JPanel{
Generator gs;
public MapaSwiata(){
//...
gs = new Generator(this);
//...
}
}
CLASS Generator(带有需要更改的ArrayList)
public class Generator{
ArrayList<Object> sampleArray;
public Generator(JPanel p){
this.s = new ArrayList<Samolot>();
this.p = p;
generatorTimer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addItem();
p.repaint();
}
});
generatorTimer.start();
}
public addItem(){
//....
}
}
最后一个类CLASS MyPanel - 面板,当我的ArrayList被更改时需要重新绘制
public class MyPanel extends JPanel{
JLabel label1;
public MyPanel(){
// to do:
// print a ArrayList<Object> sampleArray here in JLabels
// if sampleArray has been changed - my panel repaints itself
}
}
所以我的问题是:
1.将sampleArray从我的班级Generator
传递到此面板以打印它的最佳方法是什么
2.在哪里/如何/用什么听众让他通知我上一堂课关于MapaSwiata
答案 0 :(得分:1)
AWT和Swing使用事件来处理它。你应该在ClassA中有一个允许注册事件监听器的方法。每次在ClassA实例中修改列表时,都应修改已注册的侦听器。
所以ClassB应该注册一个ClassA实例的监听器,这个监听器应该通过从ClassA实例中获取修改后的列表来更新面板。
就像你将一个ActionListener注册到一个JButton一样,这个JButton每次点击都会通知所有的听众。
阅读http://docs.oracle.com/javase/tutorial/uiswing/events/index.html