Java 的 Swing 是一个用于构建图形用户界面 (GUI) 的库,它提供了丰富的组件和工具来创建跨平台的桌面应用程序。Swing 是 Java Foundation Classes (JFC) 的一部分,提供了更灵活和可定制的 GUI 组件,与早期的 Abstract Window Toolkit (AWT) 相比,它有更多的功能和更好的性能。

Swing 提供了许多基本的 GUI 组件,这些组件可以组合和定制来创建复杂的用户界面。以下是一些常用的 Swing 组件:

  1. JFrame:顶层窗口,用于创建应用程序的主窗口。
  2. JPanel:轻量级容器,可以在其中放置其他组件,并且可以使用不同的布局管理器。
  3. JButton:按钮组件,用于触发事件。
  4. JLabel:标签组件,用于显示文本或图标。
  5. JTextField:单行文本输入框。
  6. JTextArea:多行文本输入框。
  7. JPasswordField:密码输入框,输入的内容用掩码字符显示。
  8. JCheckBox:复选框组件,可以选择或取消选择。
  9. JRadioButton:单选按钮,通常与 ButtonGroup 一起使用,以确保在一组按钮中只有一个按钮被选择。
  10. JComboBox:组合框组件,可以从下拉列表中选择一个选项。
  11. JList:列表组件,可以选择一个或多个选项。
  12. JScrollPane:滚动面板,用于在视图中包含大型组件,并提供滚动功能。
  13. JTabbedPane:选项卡面板,可以在同一个窗口中显示多个选项卡。
  14. JMenuBarJMenuJMenuItem:用于创建菜单栏和菜单项。

第一节 组合框与列表

Swing 组合框 (JComboBox)

JComboBox 是一个下拉列表组件,允许用户从预定义的选项中选择一个值。

package com.xml.learn;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ComboBoxExample {
	public static void main(String[] args) {
		// 创建顶级容器
		JFrame frame = new JFrame("JComboBox Example");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 300);
		
		// 创建中间级容器其
		JPanel panel = new JPanel();
		
		// 创建组合框
		String[] items = {"Item1", "Item2", "Item3", "Item4"};
		JComboBox<String> comboBox = new JComboBox<>(items);  // 使用泛型
		
		panel.add(comboBox);  // 组合框加入中间级容器
		frame.add(panel);    // 中间级容器加入顶级容器
		
		frame.setVisible(true);		
	}
}

执行效果:

【添油加醋的Java基础】第九章 Swing组件_对话框

Swing 列表 (JList)

JList 是一个列表组件,可以显示一个或多个选项,并允许用户选择一个或多个选项。

package com.xml.learn;

import javax.swing.*;
import java.awt.*;

public class ListExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JList Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        
        JPanel panel = new JPanel();
        
        String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" };
        JList<String> list = new JList<>(items);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        JScrollPane scrollPane = new JScrollPane(list);
        panel.add(scrollPane);
        frame.add(panel);
        
        frame.setVisible(true);
    }
}

执行效果:

【添油加醋的Java基础】第九章 Swing组件_对话框_02

组合框与列表的使用

  1. 组合框 (JComboBox):
  • 通常用于提供有限的选项集。
  • 用户可以选择一个选项,也可以通过自定义编辑器使其可编辑。
  1. 列表 (JList):
  • 通常用于显示大量选项。
  • 可以配置为允许单选、多选或无选择。

示例应用

综合使用组合框和列表的示例应用:

import javax.swing.*;
import java.awt.*;

public class ComboBoxAndListExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("ComboBox and List Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        
        JPanel panel = new JPanel(new BorderLayout());
        
        // JComboBox
        String[] comboBoxItems = { "Option 1", "Option 2", "Option 3", "Option 4" };
        JComboBox<String> comboBox = new JComboBox<>(comboBoxItems);
        panel.add(comboBox, BorderLayout.NORTH);
        
        // JList
        String[] listItems = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
        JList<String> list = new JList<>(listItems);
        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(list);
        panel.add(scrollPane, BorderLayout.CENTER);
        
        frame.add(panel);
        frame.setVisible(true);
    }
}

执行效果:(JList按CTRL或者SHIFT可实现多选)

【添油加醋的Java基础】第九章 Swing组件_组件_03

【添油加醋的Java基础】第九章 Swing组件_夏明亮_04

JComboBoxJList 是 Swing 中常用的选择组件。

JComboBox 提供单选下拉列表。

JList 提供多选列表,并且可以配置选择模式。

这些组件可以结合其他 Swing 组件使用,创建复杂的用户界面。

第二节 文本组件

Java Swing 提供了多种文本组件,用于显示和编辑文本内容。常用的 Swing 文本组件包括 JTextFieldJPasswordFieldJTextAreaJEditorPane 等。这些组件可以满足不同的需求,从简单的单行文本输入到复杂的多行文本编辑和显示。

常用文本组件

1. JTextField

JTextField 是一个单行文本输入框,用于接收用户输入。

package com.xml.learn;

import javax.swing.*;
import java.awt.*;

public class JTextFieldExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JTextField Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        
        JPanel panel = new JPanel();
        JTextField textField = new JTextField(20);
        
        panel.add(textField);
        frame.add(panel);
        
        frame.setVisible(true);
    }
}

执行结果:

【添油加醋的Java基础】第九章 Swing组件_对话框_05



2. JPasswordField

JPasswordField 是一个密码输入框,输入的内容用掩码字符显示。

package com.xml.learn;

import javax.swing.*;
import java.awt.*;

public class JPasswordFieldExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JPasswordField Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        
        JPanel panel = new JPanel();
        JPasswordField passwordField = new JPasswordField(20);
        
        panel.add(passwordField);
        frame.add(panel);
        
        frame.setVisible(true);
    }
}

执行结果:

【添油加醋的Java基础】第九章 Swing组件_组件_06



3. JTextArea

JTextArea 是一个多行文本输入框,用于接收和显示多行文本。

package com.xml.learn;

import javax.swing.*;
import java.awt.*;

public class JTextAreaExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JTextArea Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        
        JPanel panel = new JPanel();
        JTextArea textArea = new JTextArea(5, 20);
        JScrollPane scrollPane = new JScrollPane(textArea);
        
        panel.add(scrollPane);
        frame.add(panel);
        
        frame.setVisible(true);
    }
}

执行效果:

【添油加醋的Java基础】第九章 Swing组件_对话框_07


4. JEditorPane

JEditorPane 是一个高级文本组件,可以显示和编辑多种格式的内容,例如 HTML 和 RTF。

package com.xml.learn;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;

public class JEditorPaneExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JEditorPane Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        
        JPanel panel = new JPanel(new BorderLayout());
        JEditorPane editorPane = new JEditorPane();
        
        try {
            editorPane.setPage("https://www.baidu.com");
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        JScrollPane scrollPane = new JScrollPane(editorPane);
        panel.add(scrollPane, BorderLayout.CENTER);
        
        frame.add(panel);
        frame.setVisible(true);
    }
}

执行结果:

【添油加醋的Java基础】第九章 Swing组件_对话框_08



主要方法和属性

以下是一些常用的文本组件的主要方法和属性:

  • JTextField 和 JPasswordField:
  • getText(): 获取文本内容。
  • setText(String text): 设置文本内容。
  • setColumns(int columns): 设置文本字段的列数。
  • JTextArea:
  • getText(): 获取文本内容。
  • setText(String text): 设置文本内容。
  • setRows(int rows): 设置文本区域的行数。
  • setColumns(int columns): 设置文本区域的列数。
  • JEditorPane:
  • setPage(URL url): 设置显示页面的 URL。
  • setPage(String url): 设置显示页面的 URL(字符串格式)。
  • setText(String text): 设置显示的文本内容。

事件处理

所有文本组件都可以处理用户输入事件。例如,可以使用 ActionListener 来监听 JTextField 的回车事件:

package com.xml.learn;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTextFieldActionListenerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JTextField ActionListener Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        
        JPanel panel = new JPanel();
        JTextField textField = new JTextField(20);
        
        textField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("TextField content: " + textField.getText());
            }
        });
        
        panel.add(textField);
        frame.add(panel);
        
        frame.setVisible(true);
    }
}

执行效果:

【添油加醋的Java基础】第九章 Swing组件_夏明亮_09

当用户在 JTextField 中输入文本并按下回车键时,会触发 ActionListener,并在控制台输出文本内容。

  • JTextFieldJPasswordField 是单行文本输入组件,分别用于普通文本和密码输入。
  • JTextArea 是多行文本输入组件,用于显示和编辑多行文本。
  • JEditorPane 是高级文本组件,可以显示和编辑复杂格式的文本内容。

这些文本组件广泛用于 Java Swing 应用程序中,提供了丰富的文本显示和编辑功能。

第三节 菜单组件

Java Swing 提供了强大的菜单组件,用于在 GUI 应用程序中创建和管理菜单。主要的菜单组件包括 JMenuBarJMenuJMenuItemJCheckBoxMenuItemJRadioButtonMenuItem。这些组件可以帮助开发者创建层次化的菜单系统,提供丰富的用户交互功能。

主要菜单组件

1. JMenuBar

JMenuBar 是菜单栏,通常放置在窗口的顶部。

2. JMenu

JMenu 是菜单项,可以包含多个子菜单或菜单项。

3. JMenuItem

JMenuItem 是具体的菜单项,可以触发特定的操作。

4. JCheckBoxMenuItem

JCheckBoxMenuItem 是复选框菜单项,可以选中或取消选中。

5. JRadioButtonMenuItem

JRadioButtonMenuItem 是单选按钮菜单项,一组选项中只能选中一个。

示例代码

以下是一个使用上述菜单组件创建简单菜单的示例:

package com.xml.learn;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MenuExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Menu Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        
        JMenuBar menuBar = new JMenuBar();

        // 创建文件菜单
        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);
        
        // 创建文件菜单项
        JMenuItem openItem = new JMenuItem("Open");
        JMenuItem saveItem = new JMenuItem("Save");
        JMenuItem exitItem = new JMenuItem("Exit");

        // 添加文件菜单项到文件菜单
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.addSeparator(); // 添加分隔符
        fileMenu.add(exitItem);
        
        // 创建编辑菜单
        JMenu editMenu = new JMenu("Edit");
        menuBar.add(editMenu);
        
        // 创建编辑菜单项
        JMenuItem cutItem = new JMenuItem("Cut");
        JMenuItem copyItem = new JMenuItem("Copy");
        JMenuItem pasteItem = new JMenuItem("Paste");

        // 添加编辑菜单项到编辑菜单
        editMenu.add(cutItem);
        editMenu.add(copyItem);
        editMenu.add(pasteItem);

        // 创建查看菜单
        JMenu viewMenu = new JMenu("View");
        menuBar.add(viewMenu);

        // 创建复选框菜单项
        JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem("Show Line Numbers");
        viewMenu.add(checkBoxMenuItem);

        // 创建单选按钮菜单项
        JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem("Light Theme");
        JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem("Dark Theme");

        // 创建按钮组,确保只有一个单选按钮菜单项被选中
        ButtonGroup group = new ButtonGroup();
        group.add(radioButtonMenuItem1);
        group.add(radioButtonMenuItem2);

        viewMenu.add(radioButtonMenuItem1);
        viewMenu.add(radioButtonMenuItem2);

        // 设置菜单栏
        frame.setJMenuBar(menuBar);

        // 添加菜单项事件监听器
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        frame.setVisible(true);
    }
}

执行效果:

【添油加醋的Java基础】第九章 Swing组件_Swing_10

【添油加醋的Java基础】第九章 Swing组件_夏明亮_11


主要方法和属性

  • JMenuBar
  • add(JMenu menu): 将菜单添加到菜单栏。
  • JMenu
  • add(JMenuItem menuItem): 将菜单项添加到菜单。
  • addSeparator(): 添加分隔符。
  • JMenuItem
  • addActionListener(ActionListener listener): 为菜单项添加动作监听器。
  • JCheckBoxMenuItem
  • setSelected(boolean b): 设置复选框菜单项的选中状态。
  • isSelected(): 返回复选框菜单项的选中状态。
  • JRadioButtonMenuItem
  • setSelected(boolean b): 设置单选按钮菜单项的选中状态。
  • isSelected(): 返回单选按钮菜单项的选中状态。

菜单事件处理

菜单项通常会添加动作监听器来处理用户选择菜单项后的操作。例如:

exitItem.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
});

在这个示例中,当用户选择 "File"->"Exit" 菜单项时,程序会退出。

总结

  • JMenuBar 是菜单栏,用于容纳菜单。
  • JMenu 是菜单,可以包含子菜单或菜单项。
  • JMenuItem 是具体的菜单项,用于触发特定操作。
  • JCheckBoxMenuItem 是复选框菜单项,可以选中或取消选中。
  • JRadioButtonMenuItem 是单选按钮菜单项,一组选项中只能选中一个。

第四节 对话框组件

Java Swing 提供了多种对话框组件,用于与用户进行交互,包括消息对话框、输入对话框、确认对话框等。主要的对话框类是 JOptionPane,它提供了许多静态方法来显示各种类型的对话框。

JOptionPane

JOptionPane 是一个实用类,包含一系列静态方法,用于创建并显示各种类型的对话框。这些对话框包括:

  1. 消息对话框(Message Dialog)
  2. 确认对话框(Confirmation Dialog)
  3. 输入对话框(Input Dialog)
  4. 选项对话框(Option Dialog)

主要对话框类型

1. 消息对话框

用于向用户显示一条消息。

JOptionPane.showMessageDialog(null, "This is a message dialog.");

可以指定对话框的消息类型,如信息、警告、错误等。

JOptionPane.showMessageDialog(null, "This is an information message.", "Information", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "This is a warning message.", "Warning", JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(null, "This is an error message.", "Error", JOptionPane.ERROR_MESSAGE);
2. 确认对话框

用于向用户提出一个是/否的问题。

int response = JOptionPane.showConfirmDialog(null, "Do you want to proceed?", "Confirmation", JOptionPane.YES_NO_OPTION);
if (response == JOptionPane.YES_OPTION) {
    System.out.println("User chose Yes.");
} else {
    System.out.println("User chose No.");
}
3. 输入对话框

用于从用户处获取输入。

String userInput = JOptionPane.showInputDialog(null, "Please enter your name:");
System.out.println("User input: " + userInput);

可以提供默认输入值:

String userInput = JOptionPane.showInputDialog(null, "Please enter your name:", "Default Name");
System.out.println("User input: " + userInput);
4. 选项对话框

用于向用户提供一组自定义选项。

Object[] options = {"Option 1", "Option 2", "Option 3"};
int response = JOptionPane.showOptionDialog(null, "Choose an option", "Option Dialog", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]);
System.out.println("User chose: " + options[response]);

使用示例

以下是一个示例程序,展示了如何使用上述对话框类型:

package com.xml.learn;

import javax.swing.*;

public class DialogExample {
    public static void main(String[] args) {
        // 消息对话框
        JOptionPane.showMessageDialog(null, "This is an information message.", "Information", JOptionPane.INFORMATION_MESSAGE);
        JOptionPane.showMessageDialog(null, "This is a warning message.", "Warning", JOptionPane.WARNING_MESSAGE);
        JOptionPane.showMessageDialog(null, "This is an error message.", "Error", JOptionPane.ERROR_MESSAGE);

        // 确认对话框
        int confirmResponse = JOptionPane.showConfirmDialog(null, "Do you want to proceed?", "Confirmation", JOptionPane.YES_NO_OPTION);
        if (confirmResponse == JOptionPane.YES_OPTION) {
            System.out.println("User chose Yes.");
        } else {
            System.out.println("User chose No.");
        }

        // 输入对话框
        String userInput = JOptionPane.showInputDialog(null, "Please enter your name:");
        System.out.println("User input: " + userInput);

        // 选项对话框
        Object[] options = {"Option 1", "Option 2", "Option 3"};
        int optionResponse = JOptionPane.showOptionDialog(null, "Choose an option", "Option Dialog", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]);
        System.out.println("User chose: " + options[optionResponse]);
    }
}

执行结果:

【添油加醋的Java基础】第九章 Swing组件_组合框_12

【添油加醋的Java基础】第九章 Swing组件_组件_13

【添油加醋的Java基础】第九章 Swing组件_组件_14

【添油加醋的Java基础】第九章 Swing组件_夏明亮_15

【添油加醋的Java基础】第九章 Swing组件_对话框_16

【添油加醋的Java基础】第九章 Swing组件_夏明亮_17


在Console中显示结果:

【添油加醋的Java基础】第九章 Swing组件_组件_18

  • 消息对话框:显示信息、警告或错误消息给用户。
  • 确认对话框:请求用户确认某个操作(是/否)。
  • 输入对话框:从用户获取输入。
  • 选项对话框:向用户提供一组自定义选项供选择。

这些对话框组件可以显著增强 Java Swing 应用程序的用户交互体验。

本章小结

习题