- 浏览: 11316 次
- 性别:
- 来自: 北京
最新评论
高级Swing学习
一.列表
1.1 JList构件
JList———————显示对象列表并且允许用户选择一个或多个项的组件。单独的模型 ListModel
维护列表的内容。
String word[] = {"1","2","3"};
JList list = new JList(word);
一般JList 都是滚动的,但是java有滚动面板,普通组件不能自动滚动
JScollPane scollPane = new JScollPane(list );
然后把滚动面板插入都外围面板上。
默认JList能显示8个选项,但是可以setVisibleRowCount(8)设置显示。
JList.VERTICAL-------------垂直排放所有选项
JList.VERTICAL_WRAP--------如果选项超过可视列,开始新的一列
JList.HORIZONTAL_WRAP------ 如果选项超过可视行,开始新的一行
public void setSelectionMode(int selectionMode) --------------对选择模式进行设置
如果允许多选,列表返回的值
Object[] o = list.getSelectedValues();
如果不允许多选,返回的值
String s = (String)list.getSelectedValue();
package swing.JList; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class ListFrame extends JFrame { private static final int DEFAULT_WIDTH = 400; private static final int DEFAULT_HEIGHT = 300; private JPanel listPanel; private JList wordList; private JLabel label; private JPanel buttonPanel; private ButtonGroup group; private String prefix = "The "; private String suffix = "fox jumps over the lazy dog."; public ListFrame(){ setTitle("ListTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); String[] words={"1","2","123","36","72","46","67","15","54","34","23","ds","22","12"}; wordList = new JList(words); wordList.setVisibleRowCount(4); JScrollPane scrollPane = new JScrollPane(wordList); listPanel = new JPanel(); listPanel.add(scrollPane); wordList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { // TODO Auto-generated method stub Object[] values = wordList.getSelectedValues(); StringBuilder text = new StringBuilder(prefix); for(int i=0;i<values.length;i++){ String word = (String)values[i]; text.append(word); text.append(" "); } text.append(suffix); label.setText(text.toString()); } }); buttonPanel = new JPanel(); group = new ButtonGroup(); makeButton("Vertical", JList.VERTICAL); makeButton("Vertical Wrap", JList.VERTICAL_WRAP); makeButton("Horizontial Wrap", JList.HORIZONTAL_WRAP); add(listPanel,BorderLayout.NORTH); label = new JLabel(prefix+suffix); add(label,BorderLayout.CENTER); add(buttonPanel,BorderLayout.SOUTH); } private void makeButton(String label, final int o){ JRadioButton button = new JRadioButton(label); buttonPanel.add(button); if(group.getButtonCount()==0){ button.setSelected(true); } group.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub wordList.setLayoutOrientation(o); listPanel.revalidate(); } }); } }
1.2 列表模式
JList显示的列表是固定不变的,但是现实生活中式可变的,但是JList并没有对列表增删的操作,这是因为JList只是负责数据的可视化外观,而是用列表模型来获取数据的。
public interface ListModel{
int getSize();
Object getElementAt(int index);
addListDataListener(ListDataListener l); //增加元素时,通知JList
removeListDataListener(ListDataListener l); //删除元素时,通知JList
}
这个接口并没有指定数据时怎么样存储的,而且它也没有强制要求这些对象被存储,无论何时getElementAt(),它都会重新计算获得,这样的好处是如果一个数组很大,那样这样的设计是很有用的。
1.3 值的插入和移除
不能直接编辑列表集合,必须先获得列表模型
ListModel model = list.getModel();
1.4 值的绘制
JList不仅仅现实字符串列表,也可以显示icon对象填充的数组或者向量,只需要在JList安装一个自定义的列表单元格绘制器。
/******************************/ JList fontList = new JList(fonts.toArray()); fontList.setVisibleRowCount(4); fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fontList.setCellRenderer(new FontCellRenderer()); /******************************/
class FontCellRenderer extends JPanel implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { font = (Font) value; background = isSelected ? list.getSelectionBackground() : list.getBackground(); foreground = isSelected ? list.getSelectionForeground() : list.getForeground(); return this; } public void paintComponent(Graphics g) { String text = font.getFamily(); FontMetrics fm = g.getFontMetrics(font); g.setColor(background); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(foreground); g.setFont(font); g.drawString(text, 0, fm.getAscent()); } public Dimension getPreferredSize() { String text = font.getFamily(); Graphics g = getGraphics(); FontMetrics fm = g.getFontMetrics(font); return new Dimension(fm.stringWidth(text), fm.getHeight()); } private Font font; private Color background; private Color foreground; }
Component getListCellRendererComponent(JList list, //正在绘制的列表
Object value, //由 list.getModel().getElementAt(index) 返回的值。
int index, //单元格索引
boolean isSelected,
boolean cellHasFocus //如果指定的单元格拥有焦点,则为 true
)
二.树
一棵树是由一些节点(node)组成,每个节点要么是叶节点或者是孩子节点除了根节点(root node),每个节点都有唯一父节点,一棵树有且唯一个根节点,有时每棵树都有自己的根节点,那么它是森林
2.1 简单的树
JTree遵循模型——视图——控制器模式,构造一个JTree组件,需要提供一个树模型
JTree tree= new JTree(new TreeModel());
然而树模型是由节点组成的TreeNode.
TreeModel接口的默认实现类是DefaultTreeModel,TreeNode的默认实现类是DefaultMutableTreeNode.
TreeNode root=...;
DefaultTreeModel defaultTreeModel = new defaultTreeModel(root);
DefaultMutableTreeNode root= new DefaultMutableTreeNode("root");
DefaultMutableTreeNode child1= new DefaultMutableTreeNode("child1");
root.add(child1);
从上面不难看出,树模型就是由根节点构成的模型,然后将所有节点贯穿起来,最后形成树模型。
package swing.simple; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; public class SimpleTree extends JFrame { public SimpleTree() { setTitle("Simple Tree"); setSize(400, 400); // TreeModel model = new DefaultTreeModel(): DefaultMutableTreeNode root = new DefaultMutableTreeNode("中国"); DefaultMutableTreeNode city1 = new DefaultMutableTreeNode("北京"); DefaultMutableTreeNode city2 = new DefaultMutableTreeNode("安徽"); DefaultMutableTreeNode city3 = new DefaultMutableTreeNode("上海"); DefaultMutableTreeNode city11 = new DefaultMutableTreeNode("海淀"); DefaultMutableTreeNode city12 = new DefaultMutableTreeNode("朝阳"); DefaultMutableTreeNode city21 = new DefaultMutableTreeNode("安庆"); DefaultMutableTreeNode city22 = new DefaultMutableTreeNode("合肥"); root.add(city1); root.add(city2); root.add(city3); city1.add(city11); city1.add(city12); city2.add(city21); city2.add(city22); TreeModel model = new DefaultTreeModel(root); JTree tree = new JTree(model); add(new JScrollPane(tree)); } }
要显示这些树,结点绘制器需要绘制三个图标,一个是叶子结点图标,一个闭合的文件图标,还有一个开启的文件夹图标。有时候我们添加一个结点时,根本不知道它是否还有子节点。这时,你可以设置
node.setAllowsChildren(true);然后绘制图标时,告诉模型需要子节点,mode.setAskssetAllowsChildren(true);
编辑树和树的路径
JTree能处理的实际上不是树的结点,而是树的路径。TreePath管理树路径情况。
TreePath path = tree.getSelectionPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode )path.getLastPathComponent();
现在你拥有了当前结点,那么如果使用node.add(newNode)来编辑结点,是行不通的,因为它只是更新了模型,而视图还没有被更新,所以需要通知视图也要更新。不过有更简单的方法。
public void model.insertNodeInto(MutableTreeNode newChild, //新结点
MutableTreeNode parent, //当前结点
int index) //位置
class TreeEditFrame extends JFrame { public TreeEditFrame() { setTitle("TreeEditTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // construct tree TreeNode root = makeSampleTree(); model = new DefaultTreeModel(root); tree = new JTree(model); tree.setEditable(true); // add scroll pane with tree JScrollPane scrollPane = new JScrollPane(tree); add(scrollPane, BorderLayout.CENTER); makeButtons(); } public TreeNode makeSampleTree() { DefaultMutableTreeNode root = new DefaultMutableTreeNode("World"); DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA"); root.add(country); DefaultMutableTreeNode state = new DefaultMutableTreeNode("California"); country.add(state); DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose"); state.add(city); city = new DefaultMutableTreeNode("San Diego"); state.add(city); state = new DefaultMutableTreeNode("Michigan"); country.add(state); city = new DefaultMutableTreeNode("Ann Arbor"); state.add(city); country = new DefaultMutableTreeNode("Germany"); root.add(country); state = new DefaultMutableTreeNode("Schleswig-Holstein"); country.add(state); city = new DefaultMutableTreeNode("Kiel"); state.add(city); return root; } /** * Makes the buttons to add a sibling, add a child, and delete a node. */ public void makeButtons() { JPanel panel = new JPanel(); JButton addSiblingButton = new JButton("Add Sibling"); addSiblingButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode .getParent(); if (parent == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( "New"); int selectedIndex = parent.getIndex(selectedNode); model.insertNodeInto(newNode, parent, selectedIndex + 1); // now display new node TreeNode[] nodes = model.getPathToRoot(newNode); TreePath path = new TreePath(nodes); tree.scrollPathToVisible(path); } }); panel.add(addSiblingButton); JButton addChildButton = new JButton("Add Child"); addChildButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( "New"); model.insertNodeInto(newNode, selectedNode, selectedNode .getChildCount()); // now display new node TreeNode[] nodes = model.getPathToRoot(newNode); TreePath path = new TreePath(nodes); tree.scrollPathToVisible(path); } }); panel.add(addChildButton); JButton deleteButton = new JButton("Delete"); deleteButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); if (selectedNode != null && selectedNode.getParent() != null) model.removeNodeFromParent(selectedNode); } }); panel.add(deleteButton); add(panel, BorderLayout.SOUTH); } private DefaultTreeModel model; private JTree tree; private static final int DEFAULT_WIDTH = 400; private static final int DEFAULT_HEIGHT = 200; }
2.2 结点枚举
有时为了查找一个结点,必须遍历树的。DefaultMutableTreeNode可以使用广度优先优先或者深度优先方查询。
深度优先查询也叫后序遍历,先遍历子节点,然后访问父节点。广度优先先枚举父节点,然后才是子节点。
public DefaultMutableTreeNode findUserObject(Object userObject){ Enumration e = root.breadthFirstEnumration(); while(e.hasMoreElements()){ DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.nextElement(); if(node.getUserObject.equals(userObject)){ return node; } } return null; }
2.3 绘制结点
绘制结点设计到结点的字体以及显示的图标,这些都是由树单元格绘制器来实现的。默认下JTree由DefaultTreeCellRenderer来绘制的。另外它不能绘制外围的展开和关闭的“把手”图标。
可以通过以下三种方式来显示外观:
- 可以使用DefaultTreeCellRenderer改变结点的字体、图标以及北京颜色。适用所有节点。
DefaultTreeCellRenderer render = new DefaultTreeCellRenderer(); render.setLeafIcon(new ImageIcon("dfa.gif")); render.setOpenIcon(new ImageIcon("dfa.gif")); tree.setCellRenderer(render);
- 可以安装一个继承DefaultTreeCellRenderer的类,来改变外观。
class MyTreeCellRenderer extends DefaultTreeCellRenderer{ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; //look at node.getUserObject(); // Font font = ...expanded; return this; } }
- 可以安装一个实现TreeCellRenderer的接口,来改变外观。
2.4 监听树事件
监听树事件实现的是TreeSelectionListener接口。它有一个单一的方法void valueChang(TreeSelectionEvent e)
tree.addTreeSelectionListener(new TreeSelectionListener());
JTree适用TreeSelectionModel来管理结点的选择(单一,多个,连续)。
要找出当前选项集合:TreePath[] selectionPath = tree.getSelectionPaths();
如果限制了智能单项选,择那么:TreePath selectionPath = tree.getSelectionPath();
注意的是TreeSelectionEvent有一个getPaths(),但是这个只是变化的选项集合,不是当前选项集合。
tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent event) { // the user selected a different node--update description TreePath path = tree.getSelectionPath(); if (path == null) return; DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) path.getLastPathComponent(); Class c = (Class) selectedNode.getUserObject(); String description = getFieldDescription(c); textArea.setText(description); } }); int mode = TreeSelectionModel.SINGLE_TREE_SELECTION; tree.getSelectionModel().setSelectionMode(mode);
2.5 定制树模型(省略,以后研究学习)
三.表格
3.1 JTable 控件
JTable和树一样,它只是显示外观,数据通过表格模型加载。
Object[][] a={{"1","2"},{"21","22"}};
String name = {"num1","num2"};
JTable jt = new JTable(a,name);
3.2 表格模型
AbstractTableModel是表格模型的实现,它仅仅需要三个方法即可:
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row,int column);
发表评论
-
QQ2010山寨版--可聊天
2011-02-28 17:08 670QQ山寨比较多,前段时间密码被盗了,用了几年的QQ,密码被盗, ... -
jaf 简介
2010-11-10 15:30 0JavaBeans激活框架(JavaBeans Activ ... -
request的小问题
2010-04-15 15:46 896有段时间弄一个聊天程序: 想得到IP使用request.ge ... -
Java安全机制
2010-04-14 17:56 1322Java安全 java通过以下技术来实现安全机制 语言设 ... -
远程调用RMI
2010-04-13 17:58 1507一.客户与服务器角色 ... -
线程知识复习
2010-04-13 11:11 1187一.线程的实现方式 1.继承Thread 2.实现Runn ...
相关推荐
通过学习Swing的基础知识,开发者能够创建出功能丰富、用户友好的Java桌面应用。SwingTest可能是包含示例代码或者测试用例的文件,可以用来实践和加深对Swing的理解。在实际开发中,结合Swing库.ppt提供的详细讲解,...
### Java Swing 知识总结学习笔记 #### 一、Swing 概述 Swing 是一个用于构建桌面应用程序的 Java 图形用户界面 (GUI) 工具包,它基于 Java Abstract Window Toolkit (AWT) 构建而成。Swing 提供了更丰富的组件集...
1. **JFrame**:这是Swing中最基础的顶级容器,用于创建窗口。你可以将其他组件添加到JFrame中,形成应用程序的基本结构。 2. **JPanel**:这是一个可以容纳其他组件的容器,通常用作添加自定义布局或组合其他组件...
总的来说,Java Swing的学习涵盖了从基础组件到高级特性的全面探索,它不仅涉及到编程技术,还包括了用户体验设计和软件架构思维。深入理解并熟练运用Java Swing,将使你有能力构建功能强大、用户友好的桌面应用程序...
Swing的学习主要涵盖以下几个核心知识点: 1. **组件(Components)**:Swing中的组件是构成GUI的基本元素,如JButton、JLabel、JTextField、JTextArea、JComboBox等。每个组件都有其特定的功能,比如JButton用于...
1. **Swing组件基础**: - `JFrame`:Swing中的顶级容器,相当于AWT中的Frame,用于创建窗口。 - `JPanel`:可定制的容器,通常用作其他组件的容器或添加自定义绘制。 - `JLabel`:用于显示文本、图像或者两者的...
这篇Swing读书笔记目录旨在帮助开发者更好地理解和掌握Swing的相关知识,通过阅读和学习,可以提升在Java GUI编程上的技能。 首先,Swing是Java Foundation Classes (JFC)的一部分,它是Sun Microsystems为Java平台...
这个“JAVA-Swing学习资料入门级”压缩包文件,显然是为初学者准备的一系列教程,旨在帮助他们理解和掌握 Swing 基础。 Swing 提供了一系列组件,如按钮、文本框、菜单等,开发者可以使用这些组件来创建功能丰富的...
Java Swing 是Java Foundation Classes (JFC) 的一部分,它是一个...阅读提供的"深入学习:JFC SWING—JAVA 基础类组件集.pdf"文档,将帮助你更深入地了解和掌握这些知识,从而能够熟练地创建和定制Java桌面应用程序。
总结来说,"javaSwing初级入门知识"涵盖了从基础组件的使用到高级特性的探索。IBM的教程是很好的学习资源,通过阅读和实践,初学者可以快速掌握Swing的基本操作,为构建自己的Java桌面应用打下坚实的基础。在学习...
1. **Swing基础** - **组件体系结构**:Swing组件基于轻量级/重型组件模型,这意味着它们大部分在Java虚拟机中运行,但可与操作系统进行必要的交互。 - **顶级容器**:JFrame、JApplet和JDialog是主要的顶级容器,...
### Swing初学者入门教程知识点详解 #### 一、UI(用户界面)的深入理解 ...通过以上知识点的详细介绍,希望能够帮助初学者更好地理解和掌握Swing框架,为进一步学习和开发Java桌面应用程序奠定坚实的基础。
在Java AWT/Swing领域,掌握Swing的基础知识对于构建美观且功能强大的桌面应用程序至关重要。下面我们将深入探讨Swing的基本概念、组件、事件模型以及用户界面设计。 1. Swing组件库: Swing 提供了丰富的组件集,...
通过这个文件,你可以系统地学习Swing的各种知识。 在Swing中,基础组件如按钮(JButton)、文本框(JTextField)、标签(JLabel)等都是JComponent的子类。这些组件可以通过布局管理器(如FlowLayout、...
在实际项目中,Swing客户端可能需要连接到服务器获取数据,更新界面,或者执行远程操作,这部分知识也会涵盖网络编程和Java的Socket通信。 总之,Java Swing是一个强大且灵活的GUI工具包,它为开发者提供了构建现代...
在本项目中,"swing实现的俄罗斯方块"是一款利用Swing构建的游戏,旨在帮助初学者深入理解Java的基础知识,尤其是面向对象编程和设计模式的应用。 首先,让我们深入了解一下面向对象编程(OOP)。面向对象编程是一...
在Java学习中,Swing 提供了丰富的组件库,让开发者能够创建出美观且功能强大的应用。在"SWING-III.ppt"中,主要讲解了如何使用Swing进行文件操作以及如何利用Swing组件如JTable和JTree来展示数据。 首先,文件操作...
Swing是Java编程语言中的一个图形用户界面...对于初学者,通过实例学习是掌握Swing最有效的方法,因为实际操作可以帮助你更好地理解和记忆这些知识。所以,深入研究这些例子,将有助于你在Swing开发中变得更加熟练。
Java Swing 是Java GUI(图形用户界面)开发的重要库,它属于Java ...通过以上知识点的学习,你将能够熟练地运用Java Swing 创建各种桌面应用程序,并理解其核心机制。不断实践和探索,你将在GUI编程领域游刃有余。