//LeftPanel.java
package com.jungleford.test;
import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.Observable;
import java.util.Observer;
public final class LeftPanel extends JPanel
{// 把樹型選擇視圖布局在左邊
private JTree tree;// 樹型選擇視圖
private JScrollPane scroll;// 讓視圖可滾動
private DefaultMutableTreeNode root, node1, node2;// 根節點及兩個葉子
private Sensor sensor;// sensor是一個Observable,由于只能單根繼承,所以作為組合成員
private String file;// 圖片文件名,與RightPanel通信的內容
public LeftPanel(Observer observer)
{
file = "";
sensor = new Sensor();
sensor.addObserver(observer);// 向Observable注冊Observer
root = new DefaultMutableTreeNode("Images");
tree = new JTree(root);
node1 = new DefaultMutableTreeNode("Rabbit");
node2 = new DefaultMutableTreeNode("Devastator");
root.add(node1);
root.add(node2);
tree.addTreeSelectionListener(new TreeSelectionListener()
{// 樹節點選擇動作
public void valueChanged(TreeSelectionEvent e)
{
Object obj = e.getPath().getLastPathComponent();
if (obj instanceof DefaultMutableTreeNode)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode)obj;
if (node == root)
file = "";// 選擇根
if (node == node1)
file = "rabbit.jpg";// 選擇node1
if (node == node2)
file = "devastator.gif";// 選擇node2
sensor.setData(file);// 改變Observable
sensor.notifyObservers();// 通知observer,對象已改變
}
}
});
scroll = new JScrollPane(tree);
add(scroll, BorderLayout.CENTER);
}
public Observable getSensor()
{// 返回Observable對象,使Observer可以獲取
return sensor;
}
}
class Sensor extends Observable
{// 定義自己的Observable
private Object data;
public void setData(Object newData)
{
data = newData;
setChanged();// 改變Observable
System.out.println("Data changed!");
}
public Object getData()
{
return data;
}
}