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 应用程序。
超级会员免费看
56

被折叠的 条评论
为什么被折叠?



