57、Java 编程:XML 解析、字体与颜色设置

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();
  1. 调用 getAvailableFontFamilyNames 方法获取系统上所有可用字体的名称数组:
String[] fonts = g.getAvailableFontFamilyNames();
  1. 使用该数组创建组合框:
JComboBox fontComboBox = new JComboBox(fonts);
  1. 根据用户选择的字体名称创建 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 应用程序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值