54、Java GUI 组件:文本区域、字体、滑块与外观设置

Java GUI 组件:文本区域、字体、滑块与外观设置

1. 菜单系统相关概念简述

在 GUI 开发中,菜单系统是重要的交互组成部分,以下是常见菜单系统项目的简要描述:
- 菜单条(Menu bar) :通常位于窗口顶部,包含多个菜单的水平条。
- 菜单项(Menu item) :菜单中的单个选项,用户点击可执行相应操作。
- 复选框菜单项(Check box menu item) :带有复选框的菜单项,可选中或取消选中,用于切换某种状态。
- 单选按钮菜单项(Radio button menu item) :一组单选按钮菜单项中只能选择一个,用于在多个选项中做出单一选择。
- 子菜单(Submenu) :嵌套在其他菜单内的菜单,提供更详细的选项。
- 分隔条(Separator bar) :用于分隔菜单项,使菜单结构更清晰。

2. 文本区域(Text Areas)

文本区域是一种多行文本输入组件,与只能输入单行文本的文本字段不同,它能接受多行输入。在 Java 中,使用 JTextArea 类创建文本区域。

2.1 构造函数

JTextArea 类有两个常用构造函数:

JTextArea(int rows, int columns)
JTextArea(String text, int rows, int columns)
  • rows :文本区域要显示的行数。
  • columns :每行要显示的字符数。
  • text (第二个构造函数):文本区域初始显示的字符串。

示例代码:

JTextArea textInput = new JTextArea(20, 40);
JTextArea textInput = new JTextArea(info, 20, 40);
2.2 获取和设置文本

JTextArea 类提供了 getText setText 方法来获取和设置文本区域中的文本。

String userText = textInput.getText();
textInput.setText(info);
2.3 滚动条设置

JTextArea 组件不会自动显示滚动条,要显示滚动条,需将其添加到滚动面板中。使用 JScrollPane 类创建滚动面板。

JTextArea textInput = new JTextArea(20, 40);
JScrollPane scrollPane = new JScrollPane(textInput);

JScrollPane 类提供了 setHorizontalScrollBarPolicy setVerticalScrollBarPolicy 方法来设置水平和垂直滚动条的显示策略。

graph LR
    A[设置滚动条策略] --> B{水平滚动条}
    A --> C{垂直滚动条}
    B --> B1[JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED]
    B --> B2[JScrollPane.HORIZONTAL_SCROLLBAR_NEVER]
    B --> B3[JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS]
    C --> C1[JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED]
    C --> C2[JScrollPane.VERTICAL_SCROLLBAR_NEVER]
    C --> C3[JScrollPane.VERTICAL_SCROLLBAR_ALWAYS]

示例代码:

scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
2.4 换行设置

默认情况下, JTextArea 组件不进行换行。可使用 setLineWrap 方法开启换行功能,使用 setWrapStyleWord 方法选择换行风格(单词换行或字符换行)。

textInput.setLineWrap(true);
textInput.setWrapStyleWord(true);
3. 字体设置

组件文本的外观由字体、样式和大小决定。要更改组件文本的外观,可使用从 JComponent 类继承的 setFont 方法。

3.1 setFont 方法
void setFont(Font appearance)

需传递一个 Font 对象作为参数。

3.2 Font 类构造函数
Font(String fontName, int style, int size);
  • fontName :字体名称,Java 保证系统至少有 Dialog、DialogInput、Monospaced、SansSerif 和 Serif 字体。
  • style :文本样式,可使用 Font 类提供的常量 Font.PLAIN Font.BOLD Font.ITALIC
  • size :文本大小(以磅为单位)。

示例代码:

label.setFont(new Font("Serif", Font.BOLD, 24));
label.setFont(new Font("Serif", Font.BOLD + Font.ITALIC, 24));
4. 滑块(Sliders)

滑块是一种允许用户在一定范围内图形化调整数值的组件。在 Java 中,使用 JSlider 类创建滑块。

4.1 JSlider 类构造函数
JSlider(int orientation, int minValue, int maxValue, int initialValue)
  • orientation :滑块方向,使用 JSlider.HORIZONTAL JSlider.VERTICAL 常量。
  • minValue :滑块范围的最小值。
  • maxValue :滑块范围的最大值。
  • initialValue :滑块的初始值,决定滑块旋钮的初始位置。

示例代码:

JSlider slider1 = new JSlider(JSlider.HORIZONTAL, 0, 50, 25);
JSlider slider2 = new JSlider(JSlider.VERTICAL, 0, 50, 25);
4.2 刻度标记和标签设置

可使用 setMajorTickSpacing setMinorTickSpacing 方法设置主要和次要刻度标记的间距,使用 setPaintTicks 方法显示刻度标记,使用 setPaintLabels 方法显示标签。

slider1.setMajorTickSpacing(10);
slider1.setMinorTickSpacing(2);
slider1.setPaintTicks(true);
slider1.setPaintLabels(true);
4.3 事件处理

当滑块旋钮移动时,滑块组件会生成一个更改事件。要处理该事件,需编写一个实现 ChangeListener 接口的类,并实现 stateChanged 方法。

示例代码:

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

public class TempConverter extends JFrame {
    private JLabel label1, label2;
    private JTextField fahrenheitTemp;
    private JTextField celsiusTemp;
    private JPanel fpanel;
    private JPanel cpanel;
    private JPanel sliderPanel;
    private JSlider slider;

    public TempConverter() {
        setTitle("Temperatures");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        label1 = new JLabel("Fahrenheit: ");
        label2 = new JLabel("Celsius: ");

        fahrenheitTemp = new JTextField("32.0", 10);
        fahrenheitTemp.setEditable(false);
        celsiusTemp = new JTextField("0.0", 10);
        celsiusTemp.setEditable(false);

        slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.addChangeListener(new SliderListener());

        fpanel = new JPanel();
        fpanel.add(label1);
        fpanel.add(fahrenheitTemp);
        cpanel = new JPanel();
        cpanel.add(label2);
        cpanel.add(celsiusTemp);
        sliderPanel = new JPanel();
        sliderPanel.add(slider);

        setLayout(new GridLayout(3, 1));
        add(fpanel);
        add(cpanel);
        add(sliderPanel);

        pack();
        setVisible(true);
    }

    private class SliderListener implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
            double fahrenheit, celsius;
            celsius = slider.getValue();
            fahrenheit = (9.0 / 5.0) * celsius + 32.0;
            celsiusTemp.setText(Double.toString(celsius));
            fahrenheitTemp.setText(String.format("%.1f", fahrenheit));
        }
    }

    public static void main(String[] args) {
        new TempConverter();
    }
}
5. 外观和感觉(Look and Feel)

Java 允许为 GUI 应用程序选择不同的外观和感觉。默认的外观和感觉是 Ocean,此外还有 Metal、Motif 和 Windows 等选择。

5.1 更改外观和感觉

使用 UIManager.setLookAndFeel 方法更改应用程序的外观和感觉,该方法接受所需外观和感觉的完全限定类名作为参数。

外观和感觉 类名
Metal “javax.swing.plaf.metal.MetalLookAndFeel”
Motif “com.sun.java.swing.plaf.motif.MotifLookAndFeel”
Windows “com.sun.java.swing.plaf.windows.WindowsLookAndFeel”

示例代码:

try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
    SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception e) {
    e.printStackTrace();
}

注意:调用 UIManager.setLookAndFeel 方法后,需要调用 SwingUtilities.updateComponentTreeUI 方法更新已创建的组件。同时,该方法可能会抛出 ClassNotFoundException InstantiationException IllegalAccessException UnsupportedLookAndFeelException 等异常。

Java GUI 组件:文本区域、字体、滑块与外观设置

6. 菜单系统操作总结

在前面介绍了菜单系统各项目的概念,下面总结创建和操作这些菜单系统项目的相关类和方法:
| 操作对象 | 相关类 | 构造函数参数 | 初始选择设置 | 事件类型 |
| — | — | — | — | — |
| 常规菜单项 | JMenuItem | 菜单项文本 | 无 | 选择时生成动作事件 |
| 单选按钮菜单项 | JRadioButtonMenuItem | 菜单项文本,所属按钮组(可选) | 在构造函数中传入 true | 选择时生成动作事件 |
| 复选框菜单项 | JCheckBoxMenuItem | 菜单项文本 | 在构造函数中传入 true | 选择时生成动作事件 |
| 菜单 | JMenu | 菜单名称 | 无 | 无 |
| 菜单栏 | JMenuBar | 无 | 无 | 无 |

6.1 创建常规菜单项
JMenuItem menuItem = new JMenuItem("常规菜单项");
6.2 创建单选按钮菜单项
ButtonGroup buttonGroup = new ButtonGroup();
JRadioButtonMenuItem radioMenuItem1 = new JRadioButtonMenuItem("单选菜单项1");
JRadioButtonMenuItem radioMenuItem2 = new JRadioButtonMenuItem("单选菜单项2");
buttonGroup.add(radioMenuItem1);
buttonGroup.add(radioMenuItem2);
6.3 创建复选框菜单项
JCheckBoxMenuItem checkMenuItem = new JCheckBoxMenuItem("复选框菜单项");
6.4 创建菜单
JMenu menu = new JMenu("菜单");
menu.add(menuItem);
menu.add(radioMenuItem1);
menu.add(radioMenuItem2);
menu.add(checkMenuItem);
6.5 创建菜单栏
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
6.6 将菜单栏添加到 JFrame
JFrame frame = new JFrame();
frame.setJMenuBar(menuBar);
7. 文本区域与滚动条、换行的综合应用

在实际应用中,文本区域的滚动条和换行功能通常会一起使用。下面是一个完整的示例代码,展示了如何创建一个带有滚动条和换行功能的文本区域:

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

public class TextAreaExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("文本区域示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);

        // 创建文本区域
        JTextArea textArea = new JTextArea(20, 40);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);

        // 创建滚动面板
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        // 将滚动面板添加到框架
        frame.add(scrollPane);

        frame.setVisible(true);
    }
}
graph LR
    A[创建 JFrame] --> B[创建 JTextArea]
    B --> C[设置换行属性]
    C --> D[创建 JScrollPane]
    D --> E[设置滚动条策略]
    E --> F[将 JScrollPane 添加到 JFrame]
    F --> G[显示 JFrame]
8. 滑块的更多应用场景

滑块在很多场景中都有应用,比如音量调节、亮度调节等。下面是一个简单的音量调节示例,展示了滑块的实际应用:

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

public class VolumeControlExample {
    private JFrame frame;
    private JLabel volumeLabel;
    private JSlider volumeSlider;

    public VolumeControlExample() {
        frame = new JFrame("音量调节");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);

        volumeLabel = new JLabel("音量: 0");
        volumeSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
        volumeSlider.setMajorTickSpacing(10);
        volumeSlider.setMinorTickSpacing(1);
        volumeSlider.setPaintTicks(true);
        volumeSlider.setPaintLabels(true);

        volumeSlider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                int volume = volumeSlider.getValue();
                volumeLabel.setText("音量: " + volume);
            }
        });

        JPanel panel = new JPanel();
        panel.add(volumeLabel);
        panel.add(volumeSlider);

        frame.add(panel);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new VolumeControlExample();
            }
        });
    }
}

在这个示例中,滑块的取值范围是 0 到 100,初始值为 0。当滑块移动时,标签会显示当前的音量值。

9. 外观和感觉的动态切换

可以在程序运行时动态切换应用程序的外观和感觉。下面是一个示例代码,展示了如何通过菜单来切换不同的外观和感觉:

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

public class LookAndFeelSwitcher {
    private JFrame frame;
    private JMenuBar menuBar;
    private JMenu lookAndFeelMenu;
    private JMenuItem metalMenuItem;
    private JMenuItem motifMenuItem;
    private JMenuItem windowsMenuItem;

    public LookAndFeelSwitcher() {
        frame = new JFrame("外观和感觉切换");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);

        menuBar = new JMenuBar();
        lookAndFeelMenu = new JMenu("外观和感觉");

        metalMenuItem = new JMenuItem("Metal");
        motifMenuItem = new JMenuItem("Motif");
        windowsMenuItem = new JMenuItem("Windows");

        lookAndFeelMenu.add(metalMenuItem);
        lookAndFeelMenu.add(motifMenuItem);
        lookAndFeelMenu.add(windowsMenuItem);

        menuBar.add(lookAndFeelMenu);
        frame.setJMenuBar(menuBar);

        metalMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });

        motifMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });

        windowsMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });

        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LookAndFeelSwitcher();
            }
        });
    }
}
graph LR
    A[创建 JFrame] --> B[创建 JMenuBar 和 JMenu]
    B --> C[创建菜单项]
    C --> D[为菜单项添加事件监听器]
    D --> E[在事件处理方法中切换外观和感觉]
    E --> F[更新组件树 UI]

通过上述示例,我们可以看到 Java 在 GUI 开发中提供了丰富的组件和功能,能够满足不同的应用需求。无论是文本区域、字体设置、滑块组件还是外观和感觉的选择,都可以通过简单的代码实现。开发者可以根据具体的应用场景,灵活运用这些组件和功能,创建出美观、易用的 GUI 应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值