Java 编程:XML 解析、字体与颜色设置
1. XML 文件解析程序
在 Java 中,我们可以编写程序来读取 XML 文件并提取其中的数据。下面是一个完整的程序示例,它可以读取
movies.xml
文件,并在控制台列出每部电影的标题、年份和价格。
1.1 代码示例
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import java.text.*;
public class ListMoviesXML {
private static NumberFormat cf = NumberFormat.getCurrencyInstance();
public static void main(String[] args) {
Document doc = getDocument("movies.xml");
Element root = doc.getDocumentElement();
Element movieElement = (Element) root.getFirstChild();
Movie m;
while (movieElement != null) {
m = getMovie(movieElement);
String msg = Integer.toString(m.year);
msg += ": " + m.title;
msg += " (" + cf.format(m.price) + ")";
System.out.println(msg);
movieElement = (Element) movieElement.getNextSibling();
}
}
private static Document getDocument(String name) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new InputSource(name));
} catch (Exception e) {
System.out.println(e.getMessage());
}
return null;
}
private static Movie getMovie(Element e) {
// get the year attribute
String yearString = e.getAttribute("year");
int year = Integer.parseInt(yearString);
// get the Title element
Element tElement = (Element) e.getFirstChild();
String title = getTextValue(tElement).trim();
// get the Price element
Element pElement = (Element) tElement.getNextSibling();
String pString = getTextValue(pElement).trim();
double price = Double.parseDouble(pString);
return new Movie(title, year, price);
}
private static String getTextValue(Node n) {
return n.getFirstChild().getNodeValue();
}
private static class Movie {
public String title;
public int year;
public double price;
public Movie(String title, int year, double price) {
this.title = title;
this.year = year;
this.price = price;
}
}
}
1.2 代码解释
-
main方法 :
1. 调用getDocument方法获取movies.xml文件的Document对象。
2. 获取根元素,并使用while循环遍历所有子元素(即电影元素)。
3. 对于每个电影元素,调用getMovie方法提取年份、标题和价格信息,并创建Movie对象。
4. 将电影信息打印到控制台。 -
getDocument方法 :
1. 创建DocumentBuilderFactory对象,并设置配置选项,忽略注释和空白字符,同时验证 XML 文件。
2. 创建DocumentBuilder对象,并解析指定的 XML 文件。
3. 返回Document对象。 -
getMovie方法 :
1. 提取电影元素的年份属性。
2. 获取标题元素的文本值。
3. 获取价格元素的文本值,并将其解析为double类型。
4. 创建并返回Movie对象。 -
getTextValue方法 :获取节点的文本内容。 -
Movie类 :表示单个电影,包含标题、年份和价格属性,并提供构造函数来初始化这些属性。
1.3 程序运行结果
运行该程序,控制台将输出如下内容:
1946: It’s a Wonderful Life ($14.95)
1965: The Great Race ($12.95)
1974: Young Frankenstein ($16.95)
1975: The Return of the Pink Panther ($11.95)
1977: Star Wars ($17.95)
1987: The Princess Bride ($16.95)
1989: Glory ($14.95)
1995: Apollo 13 ($19.95)
1997: The Game ($14.95)
2001: The Lord of the Rings:The Fellowship of the Ring ($19.95)
2. Java 中字体的使用
在 Java 中,我们可以通过
Font
类来设置文本的字体、样式和大小。以下是关于字体使用的详细介绍。
2.1
Font
类概述
Font
类用于表示字体,每个
Font
对象具有三个基本特征:字体名称、样式标识符(普通、粗体、斜体或粗斜体)和字号。
2.2 创建
Font
对象
可以使用
Font
类的构造函数来创建
Font
对象,构造函数的形式如下:
Font(String name, int style, int size)
例如,创建一个名为
Papyrus
的 14 号普通字体的
Font
对象:
Font f = new Font("Papyrus", Font.PLAIN, 14);
2.3 使用字体名称
-
指定具体字体
:可以通过指定已安装字体的名称来使用该字体,例如
Times New Roman。但由于不同计算机上安装的字体可能不同,直接使用具体字体名称可能会导致问题。 -
使用逻辑字体名称
:Java 提供了几个逻辑字体名称,以实现通用的字体指定。逻辑字体名称及其描述如下表所示:
| 逻辑字体 | 描述 |
| — | — |
| Serif | 基本 serif 字体,在 Windows 上通常为Times New Roman,在其他系统上通常为Times Roman。 |
| SansSerif | 无衬线字体,在 Windows 上通常为Arial,在非 Windows 系统上通常为Helvetica。 |
| Monospaced | 等宽字体,在 Windows 上通常为Courier New,在非 Windows 系统上通常为Courier。 |
| Dialog | 用于显示系统对话框文本的字体。 |
| DialogInput | 用于系统对话框文本输入的字体。 |
2.4 使用字体样式
字体可以有四种样式:普通、粗体、斜体和粗斜体。可以使用以下常量作为
Font
类构造函数的第二个参数来设置字体样式:
-
Font.BOLD
:粗体
-
Font.ITALIC
:斜体
-
Font.PLAIN
:普通
例如,创建一个 24 号粗体的
JSL Ancient
字体:
Font f = new Font("JSL Ancient", Font.BOLD, 24);
要创建粗斜体字体,可以使用
|
运算符组合
Font.BOLD
和
Font.ITALIC
常量:
Font f = new Font("Garamond", Font.BOLD | Font.ITALIC, 12);
2.5 设置组件的字体
可以通过调用组件的
setFont
方法并传入
Font
对象来设置组件的字体。例如:
JLabel textLabel = new JLabel("Arghh, Matey");
Font f = new Font("JSL Ancient", Font.PLAIN, 16);
textLabel.setFont(f);
如果希望组件继承其容器的字体,可以将字体设置为
null
:
JPanel panel1 = new JPanel();
panel1.setFont(new Font("JSL Ancient", Font.PLAIN, 16));
JButton b1 = new JButton("Jolly");
b1.setFont(null);
panel1.add(b1);
JButton b2 = new JButton("Roger");
b2.setFont(null);
panel1.add(b2);
2.6 获取所有可用字体列表
如果希望让用户选择字体,可以获取系统上所有可用字体的列表,并将字体名称放入组合框中。具体步骤如下:
1. 获取
GraphicsEnvironment
对象,该对象表示程序运行的图形环境:
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
-
调用
getAvailableFontFamilyNames方法获取系统上所有可用字体的名称数组:
String[] fonts = g.getAvailableFontFamilyNames();
- 使用该数组创建组合框:
JComboBox fontComboBox = new JComboBox(fonts);
-
根据用户选择的字体名称创建
Font对象:
String name = (String) fontComboBox.getSelectedItem();
Font f = new Font(name, Font.PLAIN, 12);
2.7 字体操作流程图
graph TD;
A[开始] --> B[获取 GraphicsEnvironment 对象];
B --> C[获取可用字体名称数组];
C --> D[创建组合框];
D --> E[用户选择字体];
E --> F[根据选择创建 Font 对象];
F --> G[设置组件字体];
G --> H[结束];
2.8 字体操作示例程序
以下是一个简单的程序,允许用户选择字体、样式和大小来显示示例文本:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Fonts extends JFrame {
public static void main(String[] args) {
new Fonts();
}
private JLabel sampleText;
private JComboBox fontComboBox;
private JComboBox sizeComboBox;
private JCheckBox boldCheck, italCheck;
private String[] fonts;
public Fonts() {
this.setSize(500, 150);
this.setTitle("Fun with Fonts ");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FontListener fl = new FontListener();
sampleText = new JLabel("All work and no play makes Jack a dull boy");
this.add(sampleText, BorderLayout.NORTH);
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
fonts = g.getAvailableFontFamilyNames();
JPanel controlPanel = new JPanel();
fontComboBox = new JComboBox(fonts);
fontComboBox.addActionListener(fl);
controlPanel.add(new JLabel("Family: "));
controlPanel.add(fontComboBox);
Integer[] sizes = {7, 8, 9, 10, 11, 12, 14, 18, 20, 22, 24, 36};
sizeComboBox = new JComboBox(sizes);
sizeComboBox.setSelectedIndex(5);
sizeComboBox.addActionListener(fl);
controlPanel.add(new JLabel("Size: "));
controlPanel.add(sizeComboBox);
boldCheck = new JCheckBox("Bold");
boldCheck.addActionListener(fl);
controlPanel.add(boldCheck);
italCheck = new JCheckBox("Ital");
italCheck.addActionListener(fl);
controlPanel.add(italCheck);
this.add(controlPanel, BorderLayout.SOUTH);
fl.updateText();
this.setVisible(true);
}
private class FontListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
updateText();
}
public void updateText() {
String name = (String) fontComboBox.getSelectedItem();
Integer size = (Integer) sizeComboBox.getSelectedItem();
int style;
if (boldCheck.isSelected() && italCheck.isSelected()) {
style = Font.BOLD | Font.ITALIC;
} else if (boldCheck.isSelected()) {
style = Font.BOLD;
} else if (italCheck.isSelected()) {
style = Font.ITALIC;
} else {
style = Font.PLAIN;
}
Font f = new Font(name, style, size.intValue());
sampleText.setFont(f);
}
}
}
2.9 示例程序解释
-
Fonts类 :继承自JFrame,创建一个窗口,包含一个标签用于显示示例文本,以及组合框和复选框用于用户选择字体、样式和大小。 -
FontListener类 :实现ActionListener接口,处理用户的选择事件。当用户选择字体、大小或样式时,调用updateText方法更新标签的字体。 -
updateText方法 :根据用户的选择创建新的Font对象,并将其应用到标签上。
3. Java 中颜色的使用
在 Java 里,
Color
类可用于创建和操作颜色。接下来为你详细介绍颜色的使用方法。
3.1
Color
类概述
在 Java 中,颜色由
Color
类的实例表示。每种颜色是红、绿、蓝三种成分的独特组合,每种成分用一个 0 到 255 之间的整数表示,0 表示该成分颜色完全不存在,255 表示该成分颜色完全饱和。
3.2 创建颜色
-
使用构造函数
:可以通过调用
Color类的构造函数,传入红、绿、蓝的值来创建颜色对象。例如:
Color c = new Color(255, 255, 0);
此代码创建了一个红色和绿色完全饱和、蓝色为 0 的颜色,即亮黄色。
-
使用静态常量
:由于颜色数值较难记忆,
Color
类提供了一些静态常量来表示预定义的颜色,如下表所示:
| 常量 | 颜色 |
| — | — |
|
BLACK
| 黑色 |
|
GRAY
| 灰色 |
|
MAGENTA
| 洋红色 |
|
RED
| 红色 |
|
BLUE
| 蓝色 |
|
GREEN
| 绿色 |
|
ORANGE
| 橙色 |
|
WHITE
| 白色 |
|
CYAN
| 青色 |
|
LIGHT_GRAY
| 浅灰色 |
|
PINK
| 粉色 |
|
YELLOW
| 黄色 |
|
DARK_GRAY
| 深灰色 |
例如,创建一个红色的
Color
对象:
Color c = Color.RED;
-
设置透明度
:颜色还有一个透明度属性
alpha,默认值为 255,表示颜色不透明。可以使用接受alpha值作为第四个参数的构造函数来设置不同的透明度。例如:
Color c = new Color(255, 0, 0, 128);
此代码创建了一个半透明的红色。
3.3
Color
类的其他特性
-
不可变性
:
Color对象是不可变的,没有设置颜色的方法。 -
获取颜色值
:可以使用
getRed、getGreen、getBlue和getAlpha方法获取颜色的红、绿、蓝和透明度值。 -
亮度调整
:可以使用
brighter方法创建比当前颜色更亮的颜色,使用darker方法创建比当前颜色更暗的颜色。 -
参数检查
:如果调用
Color构造函数时传入的参数小于 0 或大于 255,会抛出IllegalArgumentException异常,因此在调用构造函数前需要检查参数值。 -
使用浮点数
:
Color类还提供了一个替代构造函数,允许使用 0.0 到 1.0 之间的浮点数来设置颜色成分。
3.4 使用系统颜色
SystemColor
类可用于获取与底层操作系统为各种 GUI 元素配置的颜色相对应的颜色。
SystemColor
类继承自
Color
类,因此可以在
setForeground
和
setBackground
方法或其他需要
Color
对象的方法中使用
SystemColor
对象。
SystemColor
类有许多静态方法,用于返回系统 GUI 界面不同部分使用的颜色,如下表所示:
| 字段 | 描述 |
| — | — |
|
activeCaption
| 活动窗口标题栏的背景颜色 |
|
activeCaptionBorder
| 活动窗口标题栏的边框颜色 |
|
activeCaptionText
| 活动窗口标题栏的文本颜色 |
|
control
| 控件使用的背景颜色 |
|
controlText
| 控件使用的文本颜色 |
|
desktop
| 桌面使用的背景颜色 |
|
inactiveCaption
| 非活动窗口标题栏的背景颜色 |
|
inactiveCaptionBorder
| 非活动窗口标题栏的边框颜色 |
|
inactiveCaptionText
| 非活动窗口标题栏的文本颜色 |
|
info
| 工具提示使用的背景颜色 |
|
infoText
| 工具提示使用的文本颜色 |
|
menu
| 菜单使用的背景颜色 |
|
menuText
| 菜单使用的文本颜色 |
|
textHighlight
| 高亮文本使用的背景颜色 |
|
textHighlightText
| 高亮文本使用的文本颜色 |
|
textInactiveText
| 非活动文本使用的文本颜色 |
|
textText
| 文本框和其他文本控件使用的文本颜色 |
|
extHighlight
| 高亮文本使用的背景颜色 |
|
window
| 窗口使用的背景颜色 |
|
windowBorder
| 窗口使用的边框颜色 |
|
windowText
| 窗口使用的文本颜色 |
例如,将按钮的背景颜色设置为工具提示使用的背景颜色:
button1.setBackground(SystemColor.info);
3.5 设置 Swing 组件的颜色
每个 Swing 组件都有
setForeground
和
setBackground
方法,用于设置组件的前景色(文本颜色)和背景色。例如,将标签的前景色设置为红色:
JLabel errorMessage = new JLabel("Oops!");
errorMessage.setForeground(Color.RED);
也可以将颜色设置为
null
,使组件继承其容器的颜色:
textLabel.setForeground(null);
3.6 使用颜色选择器
JColorChooser
类可以创建一个标准化的对话框,让用户选择颜色。该对话框包含三个选项卡,用户可以通过以下三种方法选择颜色:
-
Swatches 选项卡
:提供 279 种不同的预定义颜色选择。
-
HSB 选项卡
:允许用户通过指定色调(即基本颜色)、饱和度(颜色的数量)和亮度来选择颜色。
-
RGB 选项卡
:允许用户指定颜色的红、绿、蓝值。
使用以下代码即可显示颜色选择器对话框:
Color c = JColorChooser.showDialog(null, "Choose a Color", sampleText.getForeground());
此代码显示一个颜色选择器对话框,用户选择颜色后,返回所选颜色;如果用户取消选择,则返回
null
。
3.7 颜色操作流程图
graph TD;
A[开始] --> B[创建 Swing 组件];
B --> C[设置组件初始颜色];
C --> D[用户触发颜色选择操作];
D --> E[显示颜色选择器对话框];
E --> F[用户选择颜色];
F --> G[根据选择设置组件颜色];
G --> H[结束];
3.8 颜色选择器示例程序
以下是一个完整的程序,使用颜色选择器让用户选择颜色并应用到标签上:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ColorChooser extends JFrame {
public static void main(String[] args) {
new ColorChooser();
}
private JLabel sampleText;
private JButton chooseButton;
public ColorChooser() {
this.setSize(300, 100);
this.setTitle("Color Chooser");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel1 = new JPanel();
sampleText = new JLabel("All work and no play makes Jack a dull boy");
sampleText.setBackground(null);
panel1.add(sampleText);
chooseButton = new JButton("Choose Color");
chooseButton.addActionListener(new ButtonListener());
panel1.add(chooseButton);
this.add(panel1);
this.setVisible(true);
}
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Color c = JColorChooser.showDialog(null, "Choose a Color", sampleText.getForeground());
if (c != null) {
sampleText.setForeground(c);
}
}
}
}
3.9 示例程序解释
-
ColorChooser类 :继承自JFrame,创建一个窗口,包含一个标签用于显示示例文本和一个按钮用于触发颜色选择操作。 -
ButtonListener类 :实现ActionListener接口,处理按钮的点击事件。当用户点击按钮时,显示颜色选择器对话框,用户选择颜色后,将所选颜色应用到标签上。
通过以上内容,我们学习了 Java 中 XML 文件解析、字体设置和颜色设置的相关知识,掌握了如何读取 XML 文件、设置组件的字体和颜色,以及让用户选择字体和颜色的方法。这些知识可以帮助我们创建更加美观和功能丰富的 Java 应用程序。
超级会员免费看
31

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



