`
yelangchs
  • 浏览: 11316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Swing基础知识学习

    博客分类:
  • Java
阅读更多

高级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);

 

 

分享到:
评论

相关推荐

    Swing基础知识

    通过学习Swing的基础知识,开发者能够创建出功能丰富、用户友好的Java桌面应用。SwingTest可能是包含示例代码或者测试用例的文件,可以用来实践和加深对Swing的理解。在实际开发中,结合Swing库.ppt提供的详细讲解,...

    Java swing 知识总结学习笔记

    ### Java Swing 知识总结学习笔记 #### 一、Swing 概述 Swing 是一个用于构建桌面应用程序的 Java 图形用户界面 (GUI) 工具包,它基于 Java Abstract Window Toolkit (AWT) 构建而成。Swing 提供了更丰富的组件集...

    swing窗体控件学习文档

    1. **JFrame**:这是Swing中最基础的顶级容器,用于创建窗口。你可以将其他组件添加到JFrame中,形成应用程序的基本结构。 2. **JPanel**:这是一个可以容纳其他组件的容器,通常用作添加自定义布局或组合其他组件...

    java swing深入学习例子

    总的来说,Java Swing的学习涵盖了从基础组件到高级特性的全面探索,它不仅涉及到编程技术,还包括了用户体验设计和软件架构思维。深入理解并熟练运用Java Swing,将使你有能力构建功能强大、用户友好的桌面应用程序...

    swing学习

    Swing的学习主要涵盖以下几个核心知识点: 1. **组件(Components)**:Swing中的组件是构成GUI的基本元素,如JButton、JLabel、JTextField、JTextArea、JComboBox等。每个组件都有其特定的功能,比如JButton用于...

    java swing学习资料

    1. **Swing组件基础**: - `JFrame`:Swing中的顶级容器,相当于AWT中的Frame,用于创建窗口。 - `JPanel`:可定制的容器,通常用作其他组件的容器或添加自定义绘制。 - `JLabel`:用于显示文本、图像或者两者的...

    Swing学习系列 -- Swing读书笔记目录

    这篇Swing读书笔记目录旨在帮助开发者更好地理解和掌握Swing的相关知识,通过阅读和学习,可以提升在Java GUI编程上的技能。 首先,Swing是Java Foundation Classes (JFC)的一部分,它是Sun Microsystems为Java平台...

    JAVA-Swing学习资料入门级

    这个“JAVA-Swing学习资料入门级”压缩包文件,显然是为初学者准备的一系列教程,旨在帮助他们理解和掌握 Swing 基础。 Swing 提供了一系列组件,如按钮、文本框、菜单等,开发者可以使用这些组件来创建功能丰富的...

    深入学习:JFC SWING—JAVA 基础类组件集

    Java Swing 是Java Foundation Classes (JFC) 的一部分,它是一个...阅读提供的"深入学习:JFC SWING—JAVA 基础类组件集.pdf"文档,将帮助你更深入地了解和掌握这些知识,从而能够熟练地创建和定制Java桌面应用程序。

    javaSwing初级入门知识

    总结来说,"javaSwing初级入门知识"涵盖了从基础组件的使用到高级特性的探索。IBM的教程是很好的学习资源,通过阅读和实践,初学者可以快速掌握Swing的基本操作,为构建自己的Java桌面应用打下坚实的基础。在学习...

    JavaSwing学习资料

    1. **Swing基础** - **组件体系结构**:Swing组件基于轻量级/重型组件模型,这意味着它们大部分在Java虚拟机中运行,但可与操作系统进行必要的交互。 - **顶级容器**:JFrame、JApplet和JDialog是主要的顶级容器,...

    swing初学者入门教程

    ### Swing初学者入门教程知识点详解 #### 一、UI(用户界面)的深入理解 ...通过以上知识点的详细介绍,希望能够帮助初学者更好地理解和掌握Swing框架,为进一步学习和开发Java桌面应用程序奠定坚实的基础。

    Java-Swing基础资料汇总

    在Java AWT/Swing领域,掌握Swing的基础知识对于构建美观且功能强大的桌面应用程序至关重要。下面我们将深入探讨Swing的基本概念、组件、事件模型以及用户界面设计。 1. Swing组件库: Swing 提供了丰富的组件集,...

    学习Swing的文档资料

    通过这个文件,你可以系统地学习Swing的各种知识。 在Swing中,基础组件如按钮(JButton)、文本框(JTextField)、标签(JLabel)等都是JComponent的子类。这些组件可以通过布局管理器(如FlowLayout、...

    java swing漂亮界面 超酷 javaswing教程

    在实际项目中,Swing客户端可能需要连接到服务器获取数据,更新界面,或者执行远程操作,这部分知识也会涵盖网络编程和Java的Socket通信。 总之,Java Swing是一个强大且灵活的GUI工具包,它为开发者提供了构建现代...

    swing实现的俄罗斯方块 学习java基础很好 包含面向对象和设计模式

    在本项目中,"swing实现的俄罗斯方块"是一款利用Swing构建的游戏,旨在帮助初学者深入理解Java的基础知识,尤其是面向对象编程和设计模式的应用。 首先,让我们深入了解一下面向对象编程(OOP)。面向对象编程是一...

    java学习SWING

    在Java学习中,Swing 提供了丰富的组件库,让开发者能够创建出美观且功能强大的应用。在"SWING-III.ppt"中,主要讲解了如何使用Swing进行文件操作以及如何利用Swing组件如JTable和JTree来展示数据。 首先,文件操作...

    swing例子学习资料

    Swing是Java编程语言中的一个图形用户界面...对于初学者,通过实例学习是掌握Swing最有效的方法,因为实际操作可以帮助你更好地理解和记忆这些知识。所以,深入研究这些例子,将有助于你在Swing开发中变得更加熟练。

    javaswing学习教程

    Java Swing 是Java GUI(图形用户界面)开发的重要库,它属于Java ...通过以上知识点的学习,你将能够熟练地运用Java Swing 创建各种桌面应用程序,并理解其核心机制。不断实践和探索,你将在GUI编程领域游刃有余。

Global site tag (gtag.js) - Google Analytics