我想在点击每个树节点时将信息添加到jpanel jscrollpane中...请... !!!
1.我想在Tree.java中控制那个状态选择的树节点,其中Frame.java
Tree.java
package pms;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
public class Tree extends JTree {
private JTree tree;
public static int selectItem = 0;
public JTree CreateTree() {
setLayout(new BorderLayout());
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Management");
DefaultMutableTreeNode bigLeaf1 = new DefaultMutableTreeNode("Generl Affair");
DefaultMutableTreeNode bigLeaf2 = new DefaultMutableTreeNode("Personal Affair");
final DefaultMutableTreeNode leaf2 = new DefaultMutableTreeNode("Recruit");
final DefaultMutableTreeNode leaf3 = new DefaultMutableTreeNode("test");
bigLeaf1.add(leaf2);
bigLeaf2.add(leaf3);
root.add(bigLeaf1);
root.add(bigLeaf2);
tree = new JTree(root);
tree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
TreePath tp = tree.getPathForLocation(e.getX(), e.getY());
if (e.getClickCount() >= 2) {
if (tp.getLastPathComponent() == leaf2) {
selectItem = 2;
System.out.println(selectItem);
} else if (tp.getLastPathComponent() == leaf3) {
selectItem = 3;
System.out.println(selectItem);
}
}
}
});
return tree;
}
public int selectedItem() {
return selectItem;
}
}
Frame.java
package pms;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class Frame extends JFrame implements Runnable {
static int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
static int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
private JPanel pan1, pan2, pan3, pan4;
public static JScrollPane jsp2;
public Tree tree;
public static ArrayList<Viewer> ViewArr = new ArrayList<Viewer>();
public static int selectItem = 0;
public Frame() {
setTitle("Personal Management System");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(null); // AbsoulteLayout
/** Create MenuBar */
menuBar menubar = new menuBar();
setJMenuBar(menubar.CreateMenuBar());
pan1 = new JPanel(new GridLayout()); // TreeNode ScrollPane
pan2 = new JPanel(new BorderLayout()); // toolbar & ScrollPane2
pan1.setBounds(0, 0, 350, 950); // Fixed Panel Size
pan2.setBounds(350, 0, 1300, 950);
getContentPane().add(pan1);
getContentPane().add(pan2);
/** Create Tree */
tree = new Tree();
JScrollPane jsp1 = new JScrollPane(tree.CreateTree(), v, h);
pan1.add(jsp1);
/** Create toolbar Panel */
pan3 = new toolBar().CreateToolbar();
pan2.setLayout(new BorderLayout());
pan2.add(pan3, "North");
/** Create viewer ScrollPane */
jsp2 = new JScrollPane(v, h);
jsp2.setBackground(Color.cyan);
pan2.add(jsp2, "East");
setSize(1300, 950);
setVisible(true);
}
public void ShowInterViewer() {
selectItem = tree.selectedItem();
try {
if (selectItem == 2) {
System.out.println("222");
} else if (selectItem == 3) {
System.out.println("333");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Frame frame = new Frame();
frame.run();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
}
});
}
@Override
public void run() {
// TODO Auto-generated method stub
ShowInterViewer();
}
}
Viewer.java
package pms;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Viewer extends JPanel implements ActionListener{
private JPanel jp;
private JTextField tf1, tf2, tf3, tf4, tf5, tf6;
private JLabel lb1, lb2, lb3, lb4, lb5, lb6;
private JButton btn1;
private String name, sex, pass, phone, picturePath, filePath;
private Date birthday, interviewDate;
public Viewer(String name, Date birthday, String sex, Date interviewDate, String pass, String phone) {
setName(name);
setSex(sex);
setPass(pass);
setPass(pass);
CreateViewer();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
if(sex.equals("M")){
this.sex = "남자";
}else if(sex.equals("W")){
this.sex = "여자";
}
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
if(pass.equals("Y")){
this.pass = "합격";
}else if(pass.equals("N")){
this.pass = "불합격";
}
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPicturePath() {
return picturePath;
}
public void setPicturePath(String picturePath) {
this.picturePath = picturePath;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getInterviewDate() {
return interviewDate;
}
public void setInterviewDate(Date interviewDate) {
this.interviewDate = interviewDate;
}
public JPanel CreateViewer(){
jp = new JPanel(new BorderLayout());
tf1 = new JTextField(getName());
tf1.setColumns(20);
//tf1.setBounds(50,50,10,10);
tf2 = new JTextField();
tf2.setColumns(20);
tf3 = new JTextField();
tf3.setColumns(20);
tf4 = new JTextField();
tf4.setColumns(20);
tf5 = new JTextField();
tf5.setColumns(20);
tf6 = new JTextField();
tf6.setColumns(20);
lb1 = new JLabel("이름");
lb2 = new JLabel("생년월일");
lb3 = new JLabel("성별");
lb4 = new JLabel("면접일자");
lb5 = new JLabel("합격여부");
lb6 = new JLabel("연락처");
btn1 = new JButton("이력서 보기");
jp.add(tf1);
jp.add(tf2);
jp.add(tf3);
jp.add(tf4);
jp.add(tf5);
jp.add(tf6);
jp.add(lb1);
jp.add(lb2);
jp.add(lb3);
jp.add(lb4);
jp.add(lb5);
jp.add(lb6);
jp.add(btn1);
return jp;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:1)
首先,你真的不需要扩展JTree
,你没有在课程中添加任何新功能(你也没有真正使用它),而只是创建JTree
的一个实例,并为其传递一个TreeModel
实例,为您的数据建模。
这意味着您可以TreeListSelection
向JTree
添加TreeSelectionEvent
,这会告诉您选择何时更改。从生成的path
中,您可以获得所选的getLastPathComponent
,它将告诉您从根目录中选择的组件到当前选定的节点。然后,您可以使用DefaultMutableTreeNode
获取路径中的最后一个节点(将是所选节点)。
获得此信息后,您就可以决定如何将其提供给相应的视图。由于您正在使用userObject
,因此您可以将Viewer
与其关联,这样可以更轻松地为每个节点存储复杂数据。
根据您的DefaultMutableTreeNode
类,似乎数据非常普遍,在这种情况下,我会考虑创建POJO,它维护所有相关数据并将其简单地应用于getUserObject
,您可以使用Viewer
轻松提取它。然后,您只需将此对象传递给import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.Month;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
public class InterviewBrowser {
public static void main(String[] args) {
new InterviewBrowser();
}
public InterviewBrowser() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Management");
DefaultMutableTreeNode bigLeaf1 = new DefaultMutableTreeNode("Generl Affair");
DefaultMutableTreeNode bigLeaf2 = new DefaultMutableTreeNode("Personal Affair");
DefaultMutableTreeNode leaf2 = new DefaultMutableTreeNode(new InterviewHistory(
"Bob",
new Date(LocalDate.of(1972, Month.MARCH, 8).toEpochDay()),
Sex.MALE,
new Date(LocalDate.of(2015, Month.AUGUST, 10).toEpochDay()),
false,
"123456789"));
DefaultMutableTreeNode leaf3 = new DefaultMutableTreeNode(new InterviewHistory(
"Jane",
new Date(LocalDate.of(1973, Month.JANUARY, 1).toEpochDay()),
Sex.FEMALE,
new Date(LocalDate.of(2015, Month.AUGUST, 10).toEpochDay()),
true,
"87654321"));
bigLeaf1.add(leaf2);
bigLeaf2.add(leaf3);
root.add(bigLeaf1);
root.add(bigLeaf2);
DefaultTreeModel model = new DefaultTreeModel(root);
JTree tree = new JTree(model);
Viewer viewer = new Viewer();
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
TreePath path = e.getPath();
Object lastPathComponent = path.getLastPathComponent();
if (lastPathComponent instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent;
Object userObject = node.getUserObject();
if (userObject instanceof InterviewHistory) {
InterviewHistory history = (InterviewHistory) userObject;
viewer.setHistory(history);
} else {
viewer.setHistory(null);
}
} else {
viewer.setHistory(null);
}
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(tree), BorderLayout.WEST);
frame.add(viewer);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public enum Sex {
MALE,
FEMALE
}
public class InterviewHistory {
private String name;
private Date birthDate;
private Sex sex;
private Date interviewDate;
private boolean passed;
private String phone;
public InterviewHistory(String name, Date birthDate, Sex sex, Date interviewDate, boolean passed, String phone) {
this.name = name;
this.birthDate = birthDate;
this.sex = sex;
this.interviewDate = interviewDate;
this.passed = passed;
this.phone = phone;
}
public String getName() {
return name;
}
public Date getBirthDate() {
return birthDate;
}
public Sex getSex() {
return sex;
}
public Date getInterviewDate() {
return interviewDate;
}
public boolean didPass() {
return passed;
}
public String getPhone() {
return phone;
}
@Override
public String toString() {
return getName();
}
}
public static class Viewer extends JPanel {
public static final DateFormat DATE_FORMAT = DateFormat.getDateInstance();
private JTextField name;
private JTextField dateOfBirth;
private JLabel sex;
private JTextField dateOfInterview;
private JCheckBox passed;
private JTextField phone;
public Viewer() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("Name: "), gbc);
gbc.gridy++;
add(new JLabel("Date of birth: "), gbc);
gbc.gridy++;
add(new JLabel("Sex: "), gbc);
gbc.gridy++;
add(new JLabel("Date of Interview: "), gbc);
gbc.gridy++;
add(new JLabel("Passed interview: "), gbc);
gbc.gridy++;
add(new JLabel("Phone: "), gbc);
name = new JTextField(25);
dateOfBirth = new JTextField(10);
sex = new JLabel("?");
dateOfInterview = new JTextField(10);
passed = new JCheckBox();
phone = new JTextField(9);
gbc.gridx++;
gbc.gridy = 0;
add(name, gbc);
gbc.gridy++;
add(dateOfBirth, gbc);
gbc.gridy++;
add(sex, gbc);
gbc.gridy++;
add(dateOfInterview, gbc);
gbc.gridy++;
add(passed, gbc);
gbc.gridy++;
add(phone, gbc);
}
public void setHistory(InterviewHistory history) {
name.setText(history == null ? null : history.getName());
dateOfBirth.setText(history == null ? null : DATE_FORMAT.format(history.getBirthDate()));
sex.setText(history == null ? "?" : history.getSex().name());
dateOfInterview.setText(history == null ? null : DATE_FORMAT.format(history.getInterviewDate()));
passed.setSelected(history == null ? false : history.didPass());
phone.setText(history == null ? "?" : history.getPhone());
}
}
}
面板(通过某种设置器),然后让查看器相应地更新它自己的状态
有关详细信息,请查看How to Use Trees
例如......
static
不要依赖doStuff('boop')
变量的状态,这种状态不容易反映现实,而是依赖于您可以从视图/模型的状态确定的实际已知值。< / p>
任何模型的目的是为您提供显示数据的机制,您应该使用它来直接包装数据,而不是试图猜测UI或模型的状态,然后单独查找数据(IMHO)