以前做一個界面的時候常常會遇到這樣的尴尬情況
public class MainFrame extends JFrame
{
JPanel treePanel;
JTree tree;
JPanel filePanel;
}
這樣當然容易在兩者之間傳遞消息
class TreePanel extends JPanel
{
JTree tree;
}
class FilePanel extends JPanel
{
public FilePanel(JTree tree){
}
或者將一個組件線程化
class TreePanel extends JPanel
{
JTree tree;
}
class FilePanel extends JPanel implements Runnable
{
public void run()
{
while (true)
{
//監聽tree的變化
}
}
}
這樣確實可以達到我們的目的
設計模式分為創建型
其中各元素的含義如下
Subject
Object
ConcreteSubject
ConcreteObserver
Observer模式在實現MVC結構時非常有用
在大致了解了Observer模式的描述之後
這裡的Observer和Observable分別對應設計模式中的Observer和Subject
Observer的方法
update(Observable subject
Observable的方法
addObserver(Observer observer) observer向該subject注冊自己
hasChanged() 檢查該subject狀態是否發生變化
setChanged() 設置該subject的狀態為
notifyObservers() 通知observer該subject狀態發生變化
其實在AWT/Swing事件模型中用到了好幾種設計模式
JDK
回到本文一開始的那個Explorer的例子
例子代碼如下
//LeftPanel
package com
import java
import javax
import javax
import javax
import javax
import java
import java
public final class LeftPanel extends JPanel
{// 把樹型選擇視圖布局在左邊
private JTree tree;// 樹型選擇視圖
private JScrollPane scroll;// 讓視圖可滾動
private DefaultMutableTreeNode root
private Sensor sensor;// sensor是一個Observable
private String file;// 圖片文件名
public LeftPanel(Observer observer)
{
file =
sensor = new Sensor();
sensor
root = new DefaultMutableTreeNode(
tree = new JTree(root);
node
node
root
root
tree
{// 樹節點選擇動作
public void valueChanged(TreeSelectionEvent e)
{
Object obj = e
if (obj instanceof DefaultMutableTreeNode)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode)obj;
if (node == root)
file =
if (node == node
file =
if (node == node
file =
sensor
sensor
}
}
});
scroll = new JScrollPane(tree);
add(scroll
}
public Observable getSensor()
{// 返回Observable對象
return sensor;
}
}
class Sensor extends Observable
{// 定義自己的Observable
private Object data;
public void setData(Object newData)
{
data = newData;
setChanged();// 改變Observable
System
}
public Object getData()
{
return data;
}
}
//RightPanel
package com
import java
import javax
import java
import java
public class RightPanel extends JPanel implements Observer
{// 把圖片浏覽視圖布局在右邊
private Image image;
public void update(Observable subject
{// 定義接收到Observable變化後的響應動作
String file = (String)((Sensor)subject)
if (!file
{
image = Toolkit
MediaTracker tracker = new MediaTracker(this);// 定義圖像跟蹤
tracker
try
{
tracker
}
catch (InterruptedException e)
{
e
}
}
else
image = null;
repaint();// 重繪組件
}
public void paintComponent(Graphic
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27368.html