45、Java Swing组件:Spinner与Tree的使用指南

Java Swing组件:Spinner与Tree的使用指南

在Java编程中,Swing组件为开发者提供了丰富的用户界面元素。本文将详细介绍Spinner和Tree这两种组件的使用方法,包括它们的基本概念、创建步骤以及如何获取用户选择的信息。

1. 使用Spinner

Spinner是一个带有两个小箭头的文本字段,用户可以点击箭头来增加或减少文本字段中的值。通常,文本字段包含一个数字,点击箭头会对数字进行递增或递减操作。此外,还可以创建一个显示数组或集合数据的Spinner。

1.1 创建Spinner

要创建一个Spinner控件,可以使用 JSpinner 类。以下是 JSpinner 类的构造函数和方法:
| 构造函数 | 描述 |
| — | — |
| JSpinner() | 创建一个默认的Spinner,默认值为0,没有最小值和最大值。 |
| JSpinner(SpinnerModel model) | 使用指定的 SpinnerModel 对象创建一个Spinner。 |

方法 描述
void addChangeListener(ChangeListener listener) 添加一个 ChangeListener 来监听值的变化事件。
int getValue() 获取当前的值。
void setToolTipText(String text) 设置当用户将鼠标悬停在Spinner上时显示的提示文本。
1.2 创建不同类型的Spinner
  • 默认Spinner
JSpinner spinner = new JSpinner();

这个Spinner的初始值为0,每次点击箭头时,值会增加或减少1。可以使用以下代码获取当前值:

int value = spinner.getValue();
  • 使用 SpinnerNumberModel 创建数字Spinner
JSpinner hours = new JSpinner(
    new SpinnerNumberModel(1, 1, 12, 1));

上述代码创建了一个接受1到12之间整数的Spinner,初始值为1。

JSpinner minutes = new JSpinner(
    new SpinnerNumberModel(0, 0, 59, 1));

这段代码创建了一个允许用户选择0到59之间数字的Spinner。
- 使用 SpinnerListModel 创建列表Spinner

String[] ampmString = {"am", "pm"};
JSpinner ampm = new JSpinner(
    new SpinnerListModel(ampmString));

这个Spinner允许用户选择”am”或”pm”。

2. 使用Tree

Tree是一种用于显示层次结构数据的Swing组件,通常以大纲形式呈现。在Java中,可以使用 JTree 类来创建Tree控件。

2.1 相关术语

在创建Tree控件之前,需要了解一些描述Tree元素的术语:
- 节点(Node) :Tree中的每个元素称为节点。节点必须由实现 TreeNode 接口的类创建,通常可以使用 DefaultMutableTreeNode 类。
- 根节点(Root node) :Tree的起始节点,每个Tree组件必须有且只有一个根节点。
- 子节点(Child node) :位于给定节点下方的节点称为该节点的子节点,一个节点可以有多个子节点。
- 父节点(Parent node) :位于给定节点上方的节点称为该节点的父节点,除根节点外,每个节点都有且只有一个父节点。
- 兄弟节点(Sibling nodes) :具有相同父节点的节点称为兄弟节点。
- 叶节点(Leaf node) :没有子节点的节点,表示分支的末端。
- 路径(Path) :一个节点及其所有祖先节点(即其父节点、父节点的父节点等)一直到根节点的路径。
- 展开节点(Expanded node) :其子节点可见的节点。
- 折叠节点(Collapsed node) :其子节点隐藏的节点。

2.2 构建Tree

构建Tree的最简单方法是使用 DefaultMutableTreeNode 类。以下是 DefaultMutableTreeNode 类的构造函数和方法:
| 构造函数 | 描述 |
| — | — |
| DefaultMutableTreeNode() | 创建一个空的树节点。 |
| DefaultMutableTreeNode(Object userObject) | 创建一个包含指定用户对象的树节点。 |

方法 描述
void add(TreeNode child) 添加一个子节点。
TreeNode getFirstChild() 获取该节点的第一个子节点。
DefaultMutableTreeNode getNextSibling() 获取下一个兄弟节点。
TreeNode getParent() 获取该节点的父节点。
Object getUserObject() 获取该节点的用户对象。

以下是一个构建Tree的示例,该Tree列出了三个经典电视剧的衍生剧:

graph TD;
    A[Famous Spinoffs] --> B[The Andy Griffith Show];
    B --> C[Gomer Pyle, U.S.M.C.];
    B --> D[Mayberry R.F.D.];
    A --> E[All In the Family];
    E --> F[The Jeffersons];
    F --> G[Checking In];
    E --> H[Maude];
    H --> I[Good Times];
    E --> J[Gloria];
    E --> K[Archie Bunker’s Place];
    A --> L[Happy Days];
    L --> M[Mork and Mindy];
    L --> N[Laverne and Shirley];
    L --> O[Joanie Loves Chachi];

以下是构建该Tree的代码:

// 声明变量
DefaultMutableTreeNode andy, archie, happy, george, maude;
// 创建根节点
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Famous Spinoffs");
// 创建辅助方法
private DefaultMutableTreeNode makeShow(String title, DefaultMutableTreeNode parent) {
    DefaultMutableTreeNode show = new DefaultMutableTreeNode(title);
    parent.add(show);
    return show;
}
// 创建节点
andy = makeShow("The Andy Griffith Show", root);
makeShow("Gomer Pyle, U.S.M.C.", andy);
makeShow("Mayberry R.F.D.", andy);
archie = makeShow("All In the Family", root);
george = makeShow("The Jeffersons", archie);
makeShow("Checking In", george);
maude = makeShow("Maude", archie);
makeShow("Good Times", maude);
makeShow("Gloria", archie);
makeShow("Archie Bunker’s Place", archie);
happy = makeShow("Happy Days", root);
makeShow("Mork and Mindy", happy);
makeShow("Laverne and Shirley", happy);
makeShow("Joanie Loves Chachi", happy);
3. 创建JTree组件

使用 JTree 类来创建一个显示Tree节点的组件。以下是 JTree 类的关键构造函数和方法:
| 构造函数 | 描述 |
| — | — |
| JTree() | 创建一个空的Tree,不太实用。 |
| JTree(TreeNode root) | 创建一个显示从指定节点开始的Tree的组件。 |

方法 描述
void addTreeSelectionListener(TreeSelectionListener listener) 添加一个 TreeSelectionListener 来监听树选择事件。
Object getLastSelectedPathComponent() 获取当前选中的节点。
TreeSelectionModel getSelectionModel() 获取Tree的选择模型。
void setVisibleRowCount(int count) 设置显示中可见的行数。

以下是创建 JTree 组件的步骤:
1. 声明一个 JTree 变量作为类的实例变量:

JTree tree1;
  1. 在框架构造函数中调用 JTree 构造函数创建Tree组件,并传入要显示的Tree的根节点:
tree1 = new JTree(root);
  1. 限制用户只能选择单个节点:
tree1.getSelectionModel().setSelectionMode(
    TreeSelectionModel.SINGLE_TREE_SELECTION);
  1. 设置可见行数:
tree1.setVisibleRowCount(12);
  1. 将Tree组件添加到滚动面板中,然后将滚动面板添加到框架中:
JScrollPane scroll = new JScrollPane(tree1);
JPanel panel1 = new JPanel();
panel1.add(scroll);
this.add(panel1);
4. 获取选中的节点

要确定Tree控件中当前选中的节点,可以使用 getLastSelectedPathComponent 方法。以下是一个示例:

Object o = tree1.getLastSelectedPathComponent();
DefaultMutableTreeNode show = (DefaultMutableTreeNode) o;

如果需要在用户选择节点时立即响应,可以安装一个 TreeSelectionListener 。以下是一个示例:

private class TreeListener implements TreeSelectionListener {
    public void valueChanged(TreeSelectionEvent e) {
        Object o = tree1.getLastSelectedPathComponent();
        DefaultMutableTreeNode show = (DefaultMutableTreeNode) o;
        String title = (String) show.getUserObject();
        showName.setText(title);
    }
}
tree1.addTreeSelectionListener(new TreeListener());
5. 完整示例代码

以下是一个完整的程序,创建了一个包含Tree的框架,用户可以从Tree中选择一个节目,选中节目的标题将显示在Tree下方的标签中:

import javax.swing.*;
import java.awt.event.*;
import javax.swing.tree.*;
import javax.swing.event.*;
public class SpinOffs extends JFrame {
    public static void main(String [] args) {
        new SpinOffs();
    }
    private JTree tree1;
    private DefaultTreeModel model;
    private JLabel showName;
    public SpinOffs() {
        this.setSize(225, 325);
        this.setTitle("Famous Spinoffs");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel1 = new JPanel();
        DefaultMutableTreeNode root, andy, archie, happy, george, maude;
        root = new DefaultMutableTreeNode("Famous Spin-offs");
        andy = makeShow("The Andy Griffith Show", root);
        makeShow("Gomer Pyle, U.S.M.C.", andy);
        makeShow("Mayberry R.F.D.", andy);
        archie = makeShow("All In the Family", root);
        george = makeShow("The Jeffersons", archie);
        makeShow("Checking In", george);
        maude = makeShow("Maude", archie);
        makeShow("Good Times", maude);
        makeShow("Gloria", archie);
        makeShow("Archie Bunker’s Place", archie);
        happy = makeShow("Happy Days", root);
        makeShow("Mork and Mindy", happy);
        makeShow("Laverne and Shirley", happy);
        makeShow("Joanie Loves Chachi", happy);
        tree1 = new JTree(root);
        tree1.getSelectionModel().setSelectionMode(
            TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree1.setVisibleRowCount(12);
        tree1.addTreeSelectionListener(new TreeListener());
        JScrollPane scroll = new JScrollPane(tree1);
        panel1.add(scroll);
        showName = new JLabel();
        panel1.add(showName);
        this.add(panel1);
        this.setVisible(true);
    }
    private DefaultMutableTreeNode makeShow(String title, DefaultMutableTreeNode parent) {
        DefaultMutableTreeNode show = new DefaultMutableTreeNode(title);
        parent.add(show);
        return show;
    }
    private class TreeListener implements TreeSelectionListener {
        public void valueChanged(TreeSelectionEvent e) {
            Object o = tree1.getLastSelectedPathComponent();
            DefaultMutableTreeNode show = (DefaultMutableTreeNode) o;
            String title = (String) show.getUserObject();
            showName.setText(title);
        }
    }
}

通过以上步骤,你可以在Java程序中轻松使用Spinner和Tree组件,为用户提供丰富的交互体验。希望本文对你有所帮助!

以上就是关于Java Swing中Spinner和Tree组件的详细介绍,涵盖了从创建到使用的各个方面。通过这些示例代码,你可以更好地理解和应用这些组件,为你的Java应用程序增添更多功能。

Java Swing组件:Spinner与Tree的使用指南

5. 代码分析与关键技术点解析

在上述完整示例代码中,有几个关键的技术点需要深入分析,这有助于我们更好地理解和运用 Spinner Tree 组件。

5.1 Spinner 的使用要点
  • Spinner 的构造函数选择 :根据需求选择合适的构造函数。如果只是简单的整数选择,使用默认构造函数 JSpinner() 即可;若需要控制取值范围和步长,则使用 JSpinner(SpinnerModel model) ,并搭配 SpinnerNumberModel SpinnerListModel
  • 获取 Spinner 的值 :通过 getValue() 方法可以方便地获取 Spinner 当前的值。例如:
JSpinner spinner = new JSpinner();
int value = spinner.getValue();
5.2 Tree 的构建与操作
  • DefaultMutableTreeNode 的运用 DefaultMutableTreeNode 是构建树结构的基础类。通过它的构造函数可以创建节点,并使用 add() 方法添加子节点。如:
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Famous Spinoffs");
DefaultMutableTreeNode andy = new DefaultMutableTreeNode("The Andy Griffith Show");
root.add(andy);
  • JTree 的配置 :创建 JTree 时,需要传入根节点。同时,可以通过 getSelectionModel().setSelectionMode() 方法限制用户的选择模式,通过 setVisibleRowCount() 方法设置可见行数。示例如下:
JTree tree1 = new JTree(root);
tree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree1.setVisibleRowCount(12);
  • 监听树节点的选择事件 :使用 TreeSelectionListener 可以监听用户对树节点的选择操作。当用户选择节点时, valueChanged() 方法会被触发,我们可以在该方法中获取选中节点的信息。代码如下:
private class TreeListener implements TreeSelectionListener {
    public void valueChanged(TreeSelectionEvent e) {
        Object o = tree1.getLastSelectedPathComponent();
        DefaultMutableTreeNode show = (DefaultMutableTreeNode) o;
        String title = (String) show.getUserObject();
        showName.setText(title);
    }
}
tree1.addTreeSelectionListener(new TreeListener());
6. 实际应用场景与拓展

Spinner Tree 组件在实际开发中有广泛的应用场景,下面列举一些常见的场景及拓展思路。

6.1 Spinner 的应用场景
  • 时间选择器 :如示例中所示,使用多个 Spinner 可以构建一个简单的时间选择器,分别选择小时、分钟和上下午。
  • 数量选择 :在购物车、点餐系统等场景中,用户可以通过 Spinner 选择商品的数量。
6.2 Tree 的应用场景
  • 文件目录结构展示 :可以使用 Tree 组件展示文件系统的目录结构,方便用户浏览和操作文件。
  • 组织架构展示 :在企业管理系统中,使用 Tree 展示公司的组织架构,员工可以清晰地看到部门和人员的层级关系。
6.3 拓展思路
  • 自定义节点样式 :可以通过继承 DefaultTreeCellRenderer 类,重写 getTreeCellRendererComponent() 方法来自定义树节点的显示样式,如更改字体、颜色、图标等。
  • 动态更新树结构 :在程序运行过程中,可以根据用户的操作动态添加、删除或修改树节点。例如,当用户点击某个按钮时,在树中添加一个新的子节点。
7. 总结

通过本文的介绍,我们详细了解了 Spinner Tree 这两种Java Swing组件的使用方法。从基本概念到具体的创建步骤,再到关键技术点的分析和实际应用场景的拓展,我们对这两个组件有了更深入的认识。

在实际开发中,合理运用 Spinner Tree 组件可以为用户提供更加友好和便捷的交互体验。同时,通过对代码的深入理解和拓展,我们可以根据具体需求对组件进行定制化开发,满足不同项目的需求。

以下是一个简单的流程图,总结了创建 JTree 组件的主要步骤:

graph LR;
    A[声明JTree变量] --> B[创建根节点];
    B --> C[构建树结构];
    C --> D[创建JTree组件并传入根节点];
    D --> E[配置JTree组件];
    E --> F[添加滚动面板和选择监听器];
    F --> G[添加到框架中显示];

希望本文能够帮助你更好地掌握 Spinner Tree 组件的使用,为你的Java开发工作带来更多的便利和创意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值