97、Java Swing GUI编程组件介绍

Java Swing GUI编程组件介绍

在Java的Swing库中,有许多强大的组件可以用于创建图形用户界面(GUI)。下面将为大家详细介绍几个常用的组件:JScrollPane、JList、JComboBox、JTree和JTable。

JScrollPane

JScrollPane是一个轻量级容器,它能够自动处理另一个组件的滚动。被滚动的组件可以是单个组件(如表格),也可以是包含在另一个轻量级容器(如JPanel)中的一组组件。如果被滚动的对象大于可视区域,将自动提供水平和/或垂直滚动条,用户可以通过滚动条在面板中滚动组件。

JScrollPane的默认行为是根据需要动态添加或删除滚动条。例如,如果组件比视口高,将添加垂直滚动条;如果组件完全适合视口,则移除滚动条。

JScrollPane定义了多个构造函数,常用的是 JScrollPane(Component comp) ,其中 comp 指定要滚动的组件。当面板的内容超过视口的尺寸时,滚动条将自动显示。

使用JScrollPane的步骤如下:
1. 创建要滚动的组件。
2. 创建JScrollPane实例,并将需要滚动的对象传递给它。
3. 将滚动面板添加到内容面板中。

以下是一个示例代码:

// Demonstrate JScrollPane.
import java.awt.*;
import javax.swing.*;
/*
  <applet code="JScrollPaneDemo" width=300 height=250>
  </applet>
*/

public class JScrollPaneDemo extends JApplet {

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    // Add 400 buttons to a panel.
    JPanel jp = new JPanel();
    jp.setLayout(new GridLayout(20, 20));
    int b = 0;

    for(int i = 0; i < 20; i++) {
      for(int j = 0; j < 20; j++) {
        jp.add(new JButton("Button " + b));
        ++b;
      }
    }

    // Create the scroll pane.
    JScrollPane jsp = new JScrollPane(jp);

    // Add the scroll pane to the content pane.
    // Because the default border layout is used,
    // the scroll pane will be added to the center.
    add(jsp, BorderLayout.CENTER);
  }
}
JList

在Swing中,基本的列表类是JList,它支持从列表中选择一个或多个项目。列表通常由字符串组成,但也可以创建几乎任何可显示对象的列表。

从JDK 7开始,JList变成了泛型类,声明为 class JList<E> ,其中 E 表示列表中项目的类型。

JList提供了多个构造函数,常用的是 JList(E[] items) ,它创建一个包含指定数组中项目的JList。

JList基于两个模型:ListModel和ListSelectionModel。ListModel接口定义了如何访问列表数据,ListSelectionModel接口定义了确定选择哪些列表项的方法。

虽然JList本身可以正常工作,但大多数情况下会将其包装在JScrollPane中,这样长列表将自动可滚动,简化了GUI设计,也便于更改列表中的条目数量而无需更改JList组件的大小。

当用户进行或更改选择时,JList会生成ListSelectionEvent事件。该事件在用户取消选择项目时也会生成,通过实现ListSelectionListener来处理该事件,该监听器只指定一个方法 valueChanged(ListSelectionEvent le)

默认情况下,JList允许用户选择列表中的多个范围的项目,但可以通过调用 setSelectionMode(int mode) 方法来更改此行为, mode 必须是ListSelectionModel定义的值之一:
- SINGLE_SELECTION:单选模式。
- SINGLE_INTERVAL_SELECTION:单区间选择模式。
- MULTIPLE_INTERVAL_SELECTION:多区间选择模式。

可以通过调用 getSelectedIndex() 方法获取第一个选择项的索引,如果没有选择任何项目,则返回 -1;也可以通过调用 getSelectedValue() 方法获取与选择关联的值,如果没有选择任何值,则返回null。

以下是一个简单的JList示例代码:

// Demonstrate JList.
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

/*
  <applet code="JListDemo" width=200 height=120>
  </applet>
*/

public class JListDemo extends JApplet {
  JList<String> jlst;
  JLabel jlab;
  JScrollPane jscrlp;

  // Create an array of cities.
  String Cities[] = { "New York", "Chicago", "Houston",
                      "Denver", "Los Angeles", "Seattle",
                      "London", "Paris", "New Delhi",
                      "Hong Kong", "Tokyo", "Sydney" };

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    // Change to flow layout.
    setLayout(new FlowLayout());

    // Create a JList.
    jlst = new JList<String>(Cities);

    // Set the list selection mode to single selection.
    jlst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    // Add the list to a scroll pane.
    jscrlp = new JScrollPane(jlst);

    // Set the preferred size of the scroll pane.
    jscrlp.setPreferredSize(new Dimension(120, 90));

    // Make a label that displays the selection.
    jlab = new JLabel("Choose a City");

    // Add selection listener for the list.
    jlst.addListSelectionListener(new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent le) {
        // Get the index of the changed item.
        int idx = jlst.getSelectedIndex();

        // Display selection, if item was selected.
        if(idx != -1)
          jlab.setText("Current selection: " + Cities[idx]);
        else // Otherwise, reprompt.
          jlab.setText("Choose a City");
      }
    });

    // Add the list and label to the content pane.
    add(jscrlp);
    add(jlab);
  }
}
JComboBox

Swing通过JComboBox类提供了组合框(文本字段和下拉列表的组合)。组合框通常显示一个条目,但也会显示一个下拉列表,允许用户选择不同的条目,还可以创建允许用户在文本字段中输入选择的组合框。

从JDK 7开始,JComboBox变成了泛型类,声明为 class JComboBox<E> ,其中 E 表示组合框中项目的类型。

示例中使用的JComboBox构造函数是 JComboBox(E[] items) ,它使用指定数组初始化组合框。

JComboBox使用ComboBoxModel,可变组合框(其条目可以更改)使用MutableComboBoxModel。

除了传递要在下拉列表中显示的项目数组外,还可以通过 addItem(E obj) 方法动态添加项目到选择列表中,但此方法只能用于可变组合框。

当用户从列表中选择项目时,JComboBox会生成动作事件;当选择状态更改时(即选择或取消选择项目),会生成项目事件。通常,只需监听动作事件即可,但两种事件类型都可供使用。

可以通过调用 getSelectedItem() 方法获取列表中选择的项目,需要将返回值强制转换为列表中存储的对象类型。

以下是一个JComboBox示例代码:

// Demonstrate JComboBox.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
  <applet code="JComboBoxDemo" width=300 height=200>
  </applet>
*/

public class JComboBoxDemo extends JApplet {
  JLabel jlab;
  ImageIcon hourglass, analog, digital, stopwatch;
  JComboBox<String> jcb;

  String timepieces[] = { "Hourglass", "Analog", "Digital", "Stopwatch" };

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    // Change to flow layout.
    setLayout(new FlowLayout());

    // Instantiate a combo box and add it to the content pane.
    jcb = new JComboBox<String>(timepieces);
    add(jcb);

    // Handle selections.
    jcb.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        String s = (String) jcb.getSelectedItem();
        jlab.setIcon(new ImageIcon(s + ".png"));
      }
    });

    // Create a label and add it to the content pane.
    jlab = new JLabel(new ImageIcon("hourglass.png"));
    add(jlab);
  }
}
JTree

树是一种以层次结构显示数据的组件,用户可以展开或折叠各个子树。在Swing中,树由JTree类实现。

JTree提供了多个构造函数,例如:
- JTree(Object obj [ ]) :从指定数组的元素构造树。
- JTree(Vector<?> v) :从向量的元素构造树。
- JTree(TreeNode tn) :指定根节点构造树。

JTree依赖于两个模型:TreeModel和TreeSelectionModel。它会生成多种事件,其中与树相关的三个主要事件是TreeExpansionEvent(节点展开或折叠时发生)、TreeSelectionEvent(用户选择或取消选择树中的节点时生成)和TreeModelEvent(树的数据或结构更改时触发)。

要监听TreeSelectionEvent事件,需要实现TreeSelectionListener接口,该接口只定义一个方法 valueChanged(TreeSelectionEvent tse) ,可以通过调用 tse.getPath() 方法获取选择对象的路径。

TreeNode接口声明了获取树节点信息的方法,MutableTreeNode接口扩展了TreeNode接口,声明了插入和删除子节点或更改父节点的方法。

DefaultMutableTreeNode类实现了MutableTreeNode接口,代表树中的一个节点,常用构造函数是 DefaultMutableTreeNode(Object obj)

使用JTree时,通常将其放置在JScrollPane中,以便通过较小的视口滚动大型树。

使用JTree的步骤如下:
1. 创建JTree实例。
2. 创建JScrollPane并指定树为要滚动的对象。
3. 将树添加到滚动面板中。
4. 将滚动面板添加到内容面板中。

以下是一个JTree示例代码:

// Demonstrate JTree.
import java.awt.*;
import javax.swing.event.*;
import javax.swing.*;
import javax.swing.tree.*;
/*
  <applet code="JTreeDemo" width=400 height=200>
  </applet>
*/

public class JTreeDemo extends JApplet {
  JTree tree;
  JLabel jlab;

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    // Create top node of tree.
    DefaultMutableTreeNode top = new DefaultMutableTreeNode("Options");

    // Create subtree of "A".
    DefaultMutableTreeNode a = new DefaultMutableTreeNode("A");
    top.add(a);
    DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("A1");
    a.add(a1);
    DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("A2");
    a.add(a2);

    // Create subtree of "B"
    DefaultMutableTreeNode b = new DefaultMutableTreeNode("B");
    top.add(b);
    DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("B1");
    b.add(b1);
    DefaultMutableTreeNode b2 = new DefaultMutableTreeNode("B2");
    b.add(b2);
    DefaultMutableTreeNode b3 = new DefaultMutableTreeNode("B3");
    b.add(b3);

    // Create the tree.
    tree = new JTree(top);

    // Add the tree to a scroll pane.
    JScrollPane jsp = new JScrollPane(tree);

    // Add the scroll pane to the content pane.
    add(jsp);

    // Add the label to the content pane.
    jlab = new JLabel();
    add(jlab, BorderLayout.SOUTH);

    // Handle tree selection events.
    tree.addTreeSelectionListener(new TreeSelectionListener() {
      public void valueChanged(TreeSelectionEvent tse) {
        jlab.setText("Selection is " + tse.getPath());
      }
    });
  }
}
JTable

JTable是一个用于显示数据行和列的组件。用户可以拖动列边界来调整列的大小,也可以将列拖动到新位置。根据其配置,还可以选择表中的行、列或单元格,并更改单元格内的数据。

JTable基于三个模型:TableModel、TableColumnModel和ListSelectionModel。TableModel接口定义了以二维格式显示数据的相关内容,TableColumnModel表示表列模型,ListSelectionModel确定如何选择项目。

JTable会生成多种事件,其中最基本的两个事件是ListSelectionEvent(用户在表中进行选择时生成)和TableModelEvent(表的数据发生更改时触发)。

使用JTable显示数据的步骤如下:
1. 创建JTable实例。
2. 创建JScrollPane对象并指定表为要滚动的对象。
3. 将表添加到滚动面板中。
4. 将滚动面板添加到内容面板中。

以下是一个简单的JTable示例代码:

// Demonstrate JTable.
import java.awt.*;
import javax.swing.*;
/*
  <applet code="JTableDemo" width=400 height=200>
  </applet>
*/

public class JTableDemo extends JApplet {

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    // Initialize column headings.
    String[] colHeads = { "Name", "Extension", "ID#" };

    // Initialize data.
    Object[][] data = {
      { "Gail", "4567", "865" },
      { "Ken", "7566", "555" },
      { "Viviane", "5634", "587" },
      { "Melanie", "7345", "922" },
      { "Anne", "1237", "333" },
      { "John", "5656", "314" },
      { "Matt", "5672", "217" },
      { "Claire", "6741", "444" },
      { "Erwin", "9023", "519" },
      { "Ellen", "1134", "532" },
      { "Jennifer", "5689", "112" },
      { "Ed", "9030", "133" },
      { "Helen", "6751", "145" }
    };

    // Create the table.
    JTable table = new JTable(data, colHeads);

    // Add the table to a scroll pane.
    JScrollPane jsp = new JScrollPane(table);

    // Add the scroll pane to the content pane.
    add(jsp);
  }
}

通过以上介绍,相信大家对Java Swing中的这些常用组件有了更深入的了解,可以根据实际需求选择合适的组件来创建丰富的GUI应用程序。

Java Swing GUI编程组件介绍(续)

组件特性对比

为了更清晰地了解这些组件的特点和适用场景,我们可以通过一个表格来进行对比:
| 组件名称 | 主要功能 | 常用构造函数 | 关联模型 | 主要事件 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| JScrollPane | 自动处理组件滚动 | JScrollPane(Component comp) | 无 | 无 | 当组件内容超过可视区域时,提供滚动功能 |
| JList | 支持选择一个或多个列表项 | JList(E[] items) | ListModel、ListSelectionModel | ListSelectionEvent | 展示可选择的列表项,如城市列表、选项列表等 |
| JComboBox | 文本字段和下拉列表组合 | JComboBox(E[] items) | ComboBoxModel、MutableComboBoxModel | ActionEvent、ItemEvent | 提供下拉选择项,也可允许用户输入 |
| JTree | 以层次结构显示数据 | JTree(Object obj [ ]) 等 | TreeModel、TreeSelectionModel | TreeExpansionEvent、TreeSelectionEvent、TreeModelEvent | 展示具有层次关系的数据,如文件目录、选项菜单等 |
| JTable | 显示数据行和列 | JTable(Object data[ ][ ], Object colHeads[ ]) | TableModel、TableColumnModel、ListSelectionModel | ListSelectionEvent、TableModelEvent | 展示表格形式的数据,如人员信息、数据统计等 |

组件使用流程总结

下面通过一个mermaid流程图来总结这些组件的通用使用流程:

graph TD
    A[创建组件相关对象] --> B[配置组件属性和模型]
    B --> C[处理组件事件(可选)]
    C --> D[将组件添加到滚动面板(可选)]
    D --> E[将滚动面板或组件添加到内容面板]
实际应用案例分析

假设我们要开发一个简单的员工信息管理系统,需要展示员工列表、员工详细信息表格以及一些可选择的操作选项。我们可以综合使用上述组件来实现这个系统。

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.util.Vector;

public class EmployeeManagementSystem extends JFrame {
    JList<String> employeeList;
    JTable employeeTable;
    JComboBox<String> operationComboBox;
    JTree optionTree;

    public EmployeeManagementSystem() {
        setTitle("员工信息管理系统");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 创建员工列表
        String[] employees = {"张三", "李四", "王五"};
        employeeList = new JList<>(employees);
        JScrollPane listScrollPane = new JScrollPane(employeeList);
        add(listScrollPane, BorderLayout.WEST);

        // 创建员工信息表格
        String[] colHeads = {"姓名", "部门", "职位"};
        Object[][] data = {
                {"张三", "技术部", "开发工程师"},
                {"李四", "市场部", "营销专员"},
                {"王五", "财务部", "会计"}
        };
        employeeTable = new JTable(data, colHeads);
        JScrollPane tableScrollPane = new JScrollPane(employeeTable);
        add(tableScrollPane, BorderLayout.CENTER);

        // 创建操作选项组合框
        String[] operations = {"查看详情", "编辑信息", "删除员工"};
        operationComboBox = new JComboBox<>(operations);
        operationComboBox.addActionListener(e -> {
            String selectedOperation = (String) operationComboBox.getSelectedItem();
            JOptionPane.showMessageDialog(this, "你选择了:" + selectedOperation);
        });
        add(operationComboBox, BorderLayout.NORTH);

        // 创建选项树
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("系统选项");
        DefaultMutableTreeNode sub1 = new DefaultMutableTreeNode("员工管理");
        top.add(sub1);
        sub1.add(new DefaultMutableTreeNode("添加员工"));
        sub1.add(new DefaultMutableTreeNode("批量导入"));
        optionTree = new JTree(top);
        JScrollPane treeScrollPane = new JScrollPane(optionTree);
        add(treeScrollPane, BorderLayout.EAST);

        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(EmployeeManagementSystem::new);
    }
}

在这个案例中,我们使用了JList展示员工列表,JTable展示员工详细信息,JComboBox提供操作选项,JTree展示系统的选项菜单。通过综合使用这些组件,我们可以创建一个功能丰富、界面友好的员工信息管理系统。

注意事项和常见问题

在使用这些组件时,还需要注意以下几点:
1. 布局管理 :不同的布局管理器会影响组件的显示效果和排列方式,需要根据实际需求选择合适的布局管理器,如FlowLayout、BorderLayout、GridLayout等。
2. 事件处理 :不同的组件会产生不同的事件,需要正确实现相应的事件监听器来处理这些事件,避免出现事件处理不当导致的问题。
3. 资源管理 :在创建和使用组件时,要注意资源的释放和管理,避免出现内存泄漏等问题。

通过掌握这些组件的使用方法和注意事项,你可以在Java Swing中创建出更加复杂和强大的GUI应用程序。希望本文对你有所帮助,祝你在Java GUI编程的道路上取得更好的成果!

内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用GPS、里程计和电子罗盘作为定位传感器,利用扩展卡尔曼滤波(EKF)算法对多源传感器数据进行融合处理,最终输出目标的滤波后位置信息,并提供了完整的Matlab代码实现。该方法有效提升了定位精度与稳定性,尤其适用于存在单一传感器误差或信号丢失的复杂环境,如自动驾驶、移动采用GPS、里程计和电子罗盘作为定位传感器,EKF作为多传感器的融合算法,最终输出目标的滤波位置(Matlab代码实现)机器人导航等领域。文中详细阐述了各传感器的数据建模方式、状态转移与观测方程构建,以及EKF算法的具体实现步骤,具有较强的工程实践价值。; 适合人群:具备一定Matlab编程基础,熟悉传感器原理和滤波算法的高校研究生、科研人员及从事自动驾驶、机器人导航等相关领域的工程技术人员。; 使用场景及目标:①学习和掌握多传感器融合的基本理论与实现方法;②应用于移动机器人、无人车、无人机等系统的高精度定位与导航开发;③作为EKF算法在实际工程中应用的教学案例或项目参考; 阅读建议:建议读者结合Matlab代码逐行理解算法实现过程,重点关注状态预测与观测更新模块的设计逻辑,可尝试引入真实传感器数据或仿真噪声环境以验证算法鲁棒性,并进一步拓展至UKF、PF等更高级滤波算法的研究与对比。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值