利用 Java GUI 编写简单文本编辑器
概述
本教程旨在演示如何使用 Java Swing 库创建一个功能基础的图形界面(GUI)文本编辑器。通过继承 JFrame 类并实现多个事件监听接口,我们将构建一个包含字体大小调整、颜色切换及十六进制颜色转换功能的桌面应用。文章将详细解析布局管理、组件初始化及事件处理机制。
技术环境
- 开发语言: Java (JDK 8 及以上)
- 核心框架: Swing (
javax.swing) - 布局方式: 空布局 (
NullLayout),用于精确控制组件位置
核心组件与逻辑
1. 窗口与布局
主窗口继承自 JFrame,采用空布局管理器。虽然绝对定位在响应式设计中不推荐,但在教学示例中它能直观展示坐标控制。我们禁用了窗口大小调整功能,确保界面固定。
2. 交互组件
- 字体控制: 使用
JRadioButton组选择预设字号,配合JSlider滑块进行微调。 - 颜色控制: 提供预设颜色(红/黄/蓝)单选按钮,以及自定义 RGB 和十六进制输入框。
- 文本区域:
JTextArea作为主要编辑区,支持多行文本输入。
3. 事件监听
程序实现了三个关键监听器:
ItemListener: 处理单选按钮的状态变化。ChangeListener: 监听滑块数值变动。ActionListener: 响应按钮点击事件(如颜色转换)。
代码实现
主窗口类 (TextEditorFrame)
以下代码展示了窗口的初始化、组件布局及事件绑定逻辑。注意类名虽为 NullLayout,实际代表主窗口逻辑。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class NullLayout extends JFrame implements ItemListener, ChangeListener, ActionListener {
/**
* 序列化版本 ID,防止编译器警告
*/
;
();
();
();
();
( + slider.getValue());
();
();
();
();
();
();
(, );
(, );
(, );
(, );
();
();
();
();
();
();
();
();
();
();
(, , );
(, Font.BOLD, );
(, Font.PLAIN, );
(, , );
(, , );
{
(title);
init();
}
{
setLayout();
setResizable();
add(Topjlabel);
Topjlabel.setBounds(, , , );
Topjlabel.setFont(f1);
btngroup.add(rbt1);
btngroup.add(rbt2);
btngroup.add(rbt3);
add(rbt1); add(rbt2); add(rbt3);
rbt1.setBounds(, , , );
rbt2.setBounds(, , , );
rbt3.setBounds(, , , );
rbt1.setFont(f1); rbt2.setFont(f1); rbt3.setFont(f1);
rbt1.addItemListener();
rbt2.addItemListener();
rbt3.addItemListener();
add(textarea);
textarea.setBounds(, , , );
textarea.setFont(f2);
add(Bottomjlabel);
Bottomjlabel.setBounds(, , , );
Bottomjlabel.setFont(f1);
btngroup2.add(rbt4);
btngroup2.add(rbt5);
btngroup2.add(rbt6);
add(rbt4); add(rbt5); add(rbt6);
rbt4.setBounds(, , , );
rbt5.setBounds(, , , );
rbt6.setBounds(, , , );
rbt4.setFont(f1); rbt5.setFont(f1); rbt6.setFont(f1);
rbt4.addItemListener();
rbt5.addItemListener();
rbt6.addItemListener();
add(Bottomjlabel2);
Bottomjlabel2.setBounds(, , , );
Bottomjlabel2.setFont(f1);
add(Bottomcenterjlabel);
Bottomcenterjlabel.setBounds(, , , );
Bottomcenterjlabel.setFont(f1);
add(slider);
slider.setBounds(, , , );
slider.setMajorTickSpacing();
slider.setMinorTickSpacing();
slider.setPaintLabels();
slider.setPaintTicks();
slider.setPaintTrack();
slider.addChangeListener();
add(transformtoRGB);
transformtoRGB.setBounds(, , , );
transformtoRGB.setFont(f1);
add(jtextfield);
jtextfield.setBounds(, , , );
jtextfield.setFont(f1);
add(jbtn);
jbtn.setBounds(, , , );
jbtn.setFont(f1);
jbtn.addActionListener();
add(useRGB_R);
useRGB_R.setBounds(, , , );
useRGB_R.setFont(f1);
add(useRGB_G);
useRGB_G.setBounds(, , , );
useRGB_G.setFont(f1);
add(useRGB_B);
useRGB_B.setBounds(, , , );
useRGB_B.setFont(f1);
add(R);
R.setBounds(, , , );
R.setFont(f1);
add(G);
G.setBounds(, , , );
G.setFont(f1);
add(B);
B.setBounds(, , , );
B.setFont(f1);
add(RGBbutton);
RGBbutton.setBounds(, , , );
RGBbutton.setFont(f1);
RGBbutton.addActionListener();
jdialog.setSize(, );
jdialog.getContentPane();
prompt.setFont(f1);
con.add(prompt);
jdialog2.setSize(, );
jdialog2.getContentPane();
prompt2.setFont(f1);
con2.add(prompt2);
}
{
;
(rbt1.isSelected()) {
size = ;
}
(rbt2.isSelected()) {
size = ;
}
(rbt3.isSelected()) {
size = ;
}
(rbt4.isSelected()) {
textarea.setForeground(Color.RED);
}
(rbt5.isSelected()) {
textarea.setForeground(Color.YELLOW);
}
(rbt6.isSelected()) {
textarea.setForeground(Color.BLUE);
}
(, Font.PLAIN, size);
textarea.setFont(font);
}
{
(e.getSource() == slider) {
Bottomcenterjlabel.setText( + slider.getValue());
(, Font.PLAIN, slider.getValue());
textarea.setFont(font);
}
}
{
(e.getSource() == jbtn) {
(jtextfield.getText().length() == ) {
(
transform16To_R(jtextfield.getText()),
transform16To_G(jtextfield.getText()),
transform16To_B(jtextfield.getText())
);
textarea.setForeground(color);
} {
jdialog.setLocation(, );
jdialog.setVisible();
}
}
(e.getSource() == RGBbutton) {
{
Integer.parseInt(R.getText());
Integer.parseInt(G.getText());
Integer.parseInt(B.getText());
((rVal >= && rVal <= ) && (gVal >= && gVal <= ) && (bVal >= && bVal <= )) {
(rVal, gVal, bVal);
textarea.setForeground(color);
} {
jdialog2.setLocation(, );
jdialog2.setVisible();
}
} (NumberFormatException ex) {
jdialog2.setLocation(, );
jdialog2.setVisible();
}
}
}
{
(RGB != && !.equals(RGB) && RGB.length() == ) {
Integer.valueOf(RGB.substring(, ), );
}
;
}
{
(RGB != && !.equals(RGB) && RGB.length() == ) {
Integer.valueOf(RGB.substring(, ), );
}
;
}
{
(RGB != && !.equals(RGB) && RGB.length() == ) {
Integer.valueOf(RGB.substring(, ), );
}
;
}
}


