使用可观察对象或事件或接口传递值
Passing values around using observable or events or interfaces
编辑:我知道有很多代码,但它真的很简单,我保证!
我已经编写了以下代码,试图在两个 JFrame 之间传递 e(来自 mouseListener)。我唯一的要求是使用 Observable/interfaces/events 传递值(而不是参数)
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Observable;
import javax.swing.JFrame;
public class CustomJFrame extends JFrame implements MouseListener
{
Observable observe = new Observable();
public CustomJFrame()
{
setSize(new Dimension(600,800));
addMouseListener(this);
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e)
{
System.out.println("Clicked");
observe.notifyObservers(e);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public Observable getObservable() {
return observe;
}
public void setObservable(Observable observe) {
this.observe = observe;
}
}
Class 接收 "e":
import java.awt.Label;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
public class CallMe extends JFrame implements Observer
{
Label result = new Label("Still to be changed");
public CallMe()
{
add(result);
setSize(600,600);
setVisible(true);
}
@Override
public void update(Observable o, Object arg)
{
System.out.println("Called");
result.setText(arg.toString());
}
}
最后是主要的
import java.util.Observable;
public class MainClass
{
public static void main(String[] args)
{
CustomJFrame jf = new CustomJFrame();
CallMe cm = new CallMe();
Observable ob = new Observable();
ob.addObserver(cm);
jf.setObservable(ob);
}
}
所以怎么了?
Observable.notifyObservers() will notify the observers only if the observable has been marked as changed. The way to set it changed is calling setChanged() - 该方法是 protected
而不是 public
。换句话说,您打算扩展 Observable
,而不是使用普通的 Observable
对象。 (为什么 class 不是抽象的,我不知道。它是有意义的,因为扩展它是使用它的唯一方法)。
编辑:我知道有很多代码,但它真的很简单,我保证!
我已经编写了以下代码,试图在两个 JFrame 之间传递 e(来自 mouseListener)。我唯一的要求是使用 Observable/interfaces/events 传递值(而不是参数)
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Observable;
import javax.swing.JFrame;
public class CustomJFrame extends JFrame implements MouseListener
{
Observable observe = new Observable();
public CustomJFrame()
{
setSize(new Dimension(600,800));
addMouseListener(this);
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e)
{
System.out.println("Clicked");
observe.notifyObservers(e);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public Observable getObservable() {
return observe;
}
public void setObservable(Observable observe) {
this.observe = observe;
}
}
Class 接收 "e":
import java.awt.Label;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
public class CallMe extends JFrame implements Observer
{
Label result = new Label("Still to be changed");
public CallMe()
{
add(result);
setSize(600,600);
setVisible(true);
}
@Override
public void update(Observable o, Object arg)
{
System.out.println("Called");
result.setText(arg.toString());
}
}
最后是主要的
import java.util.Observable;
public class MainClass
{
public static void main(String[] args)
{
CustomJFrame jf = new CustomJFrame();
CallMe cm = new CallMe();
Observable ob = new Observable();
ob.addObserver(cm);
jf.setObservable(ob);
}
}
所以怎么了?
Observable.notifyObservers() will notify the observers only if the observable has been marked as changed. The way to set it changed is calling setChanged() - 该方法是 protected
而不是 public
。换句话说,您打算扩展 Observable
,而不是使用普通的 Observable
对象。 (为什么 class 不是抽象的,我不知道。它是有意义的,因为扩展它是使用它的唯一方法)。