29、Java 编程:字体、颜色与声音处理实战指南

Java 编程:字体、颜色与声音处理实战指南

1. 字体与颜色的运用

在 Java 编程中,合理运用字体和颜色能够显著提升程序的吸引力。通过使用 Font Color 对象,你可以轻松改变程序的配色方案,使程序更具观赏性。

1.1 创建包含 Danger 面板的应用程序

在编译文件之后,你需要创建一个包含 Danger 面板的应用程序或小程序。以下是具体步骤:
1. 使用文字处理器创建一个名为 DangerFrame.java 的新文件。
2. 将以下代码复制到文件中:

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

public class DangerFrame extends JFrame {
    public DangerFrame () {
        super("Warning!");
        setSize(400, 70);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Danger gb = new Danger("Core Breach in Sector 12");
        Container pane = getContentPane();
        pane.add(gb);
        setContentPane(pane);
        setVisible(true);
    }

    public static void main(String[] arguments) {
        DangerFrame frame = new DangerFrame();
    }
}

你可以将第 9 行的文本替换为其他类似长度的威胁性文本,然后编译并运行该文件,即可在窗口中看到 Danger 面板。

1.2 字体和颜色使用的常见问题解答

问题 答案
文本的字号是否有上限? 组件的高度和宽度是限制因素。字号通常从 9 磅(用于小而可读的文本)到 48 磅(用于大标题)不等。选择合适的字号取决于字体类型和组件大小,通常需要通过反复试验来确定。
如果 Java 程序中定义的颜色无法在显示器上显示会怎样? 当显示器无法显示通过 setColor() setBackground() 方法选择的颜色时,它会显示最接近的现有颜色作为替代。例如, Danger 应用程序在文本从黑色循环到浅蓝色再到白色时,会根据显示器可显示的颜色数量而有不同的显示效果。

1.3 字体和颜色知识测验

问题
  1. 以下哪个不是用于选择颜色的常量?
    • a. Color.cyan
    • b. Color.teal
    • c. Color.magenta
  2. 当你更改某个对象的颜色并在容器上重新绘制它时,要使其可见必须怎么做?
    • a. 使用 drawColor() 方法。
    • b. 使用 repaint() 语句。
    • c. 什么都不做。
  3. 缩写 HSB 代表什么?
    • a. Hue Saturation Brightness
    • b. Hue Shadows Balance
    • c. Lucy in the Sky with Diamonds
答案
  1. b
  2. b。调用 repaint() 会手动调用 paintComponent() 方法。
  3. a

1.4 字体和颜色运用的拓展活动

  • Danger 应用程序中移除 update() 方法,观察其对显示质量的影响。
  • 通过传递所需背景颜色的 sRGB 值参数,为 Danger 应用程序指定背景。

2. Java 中的声音处理

如今,计算机软件中的声音处理功能越来越强大,Java 提供了播放多种格式音频文件的能力。

2.1 Java 声音处理概述

在 Java 2 引入 JavaSound 之前,Java 语言的所有声音功能都通过 JApplet 类处理。虽然这可能会让你认为声音仅适用于小程序,但实际上你可以使用该类的方法在任何 Java 程序中加载和播放声音文件。

2.2 支持的声音文件格式

Java 2 支持以下声音文件格式:
- AU 文件
- AIFF 文件
- WAV 文件
- MIDI 文件

此外,Java 还可以处理三种不同的基于 MIDI 的声音文件格式:Type 0 MIDI、Type 1 MIDI 和 RMF。

2.3 简单的声音播放

最简单的声音播放方式是使用 JApplet 类的 play() 方法。在小程序中,可以使用以下两个参数调用该方法:
- 一个 URL 对象,表示包含声音文件的文件夹。
- 一个字符串,表示声音文件的名称。

为了使程序更具灵活性,建议使用 getCodeBase() 方法提供 URL 。示例代码如下:

play(getCodeBase(), "kaboom.au");

如果找不到声音文件,不会显示错误消息,只会保持沉默。

2.4 将声音加载到 AudioClip 对象中

如果你想对声音文件进行更多操作,如重复播放、开始和停止播放等,需要将文件加载到 AudioClip 对象中。在小程序中,可按以下步骤操作:
1. 创建一个 AudioClip 对象,不调用构造方法。
2. 通过调用小程序的 getAudioClip() 方法为该对象赋值。

示例代码如下:

AudioClip dance = getAudioClip(getCodeBase(), "audio/chachacha.wav");

如果要在应用程序中加载声音文件,需要使用 JApplet 类的 newAudioClip() 方法。示例代码如下:

import java.net.URL;
import java.applet.AudioClip;
import javax.swing.JApplet;

public class SoundExample {
    public static void main(String[] args) {
        try {
            URL dance = new URL("file:audio/chachacha.wav");
            AudioClip danceClip = JApplet.newAudioClip(dance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在使用 URL 对象时,需要将 URL 构造函数放在 try-catch 块中,以处理 MalformedURLException 异常。

2.5 控制 AudioClip 对象的播放

创建 AudioClip 对象并关联声音文件后,可以使用以下三个方法控制声音的播放:
- play() :播放声音一次。
- loop() :重复播放声音。
- stop() :停止声音播放。

在调用这些方法之前,需要确保对象不为 null ,以避免出现错误。

2.6 声音混合示例: LaughTrack 应用程序

LaughTrack 应用程序由两个类组成: LaughButton (一种可点击的按钮,点击时会发出笑声)和 LaughTrack (包含该按钮的简单窗口)。以下是 LaughTrack.java 的完整代码:

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

public class LaughTrack extends JFrame {
    public LaughTrack() {
        super("Laughtrack");
        setSize(190, 80);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container content = getContentPane();
        FlowLayout flo = new FlowLayout();
        content.setLayout(flo);
        LaughButton haha = new LaughButton();
        content.add(haha);
        setContentPane(content);
        setVisible(true);
    }

    public static void main(String[] arguments) {
        LaughTrack lt = new LaughTrack();
    }
}

class LaughButton extends JButton implements Runnable, ActionListener {
    AudioClip[] laugh = new AudioClip[4];
    Thread runner;

    LaughButton() {
        super("Start Laughing");
        addActionListener(this);
        for (int i = 0; i < laugh.length; i++) {
            try {
                URL laughIn = new URL("file:laugh" + i + ".wav");
                laugh[i] = JApplet.newAudioClip(laughIn);
            } catch (MalformedURLException e) { }
        }
    }

    public void actionPerformed(ActionEvent event) {
        String command = event.getActionCommand();
        if (command == "Start Laughing")
            startLaughing();
        if (command == "Stop Laughing")
            stopLaughing();
    }

    void startLaughing() {
        if (runner == null) {
            runner = new Thread(this);
            runner.start();
            setText("Stop Laughing");
        }
    }

    void stopLaughing() {
        if (runner != null) {
            for (int i = 0; i < laugh.length; i++)
                if (laugh[i] != null)
                    laugh[i].stop();
            runner = null;
            setText("Start Laughing");
        }
    }

    public void run() {
        for (int i = 0; i < laugh.length; i++)
            if (laugh[i] != null)
                laugh[i].loop();
        Thread thisThread = Thread.currentThread();
        while (runner == thisThread) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) { }
        }
    }
}

在运行该应用程序之前,需要从指定网站下载四个音频文件: laugh0.wav laugh1.wav laugh2.wav laugh3.wav ,并将它们保存到与 LaughTrack 小程序类文件相同的文件夹中。

2.7 Java 归档

使用声音或图形的小程序通常需要加载多个不同的文件才能成功运行。为了减少加载小程序所需的时间,可以将所有文件打包成一个 Java 归档文件( .JAR )。以下是使用 jar 工具打包文件的步骤:
1. 打开命令行工具。
2. 进入包含要打包文件的文件夹。
3. 输入以下命令:

jar cf SoundFX.jar SoundFX.class fx*.wav

其中, cf 是选项, SoundFX.jar 是归档文件的名称, SoundFX.class fx*.wav 是要归档的文件。

打包完成后,可以使用 <APPLET> 标签的 ARCHIVE 属性将归档文件与小程序关联。示例代码如下:

<applet code="SoundFX.class" archive="SoundFX.jar" height=80 width=140>
</applet>

2.8 实战项目: MathMan 小程序

MathMan 小程序是一个简单的数学辅导程序,它使用 12 个声音文件( plus.wav equals.wav number0.wav number10.wav )。以下是具体步骤:
1. 从指定网站下载这 12 个声音文件,并将它们保存到与 .java .class .html 文件相同的文件夹中。
2. 创建一个名为 MathMan.java 的文件,并将以下代码复制到文件中:

import java.awt.*;
import java.applet.AudioClip;

public class MathMan extends javax.swing.JApplet implements Runnable {
    AudioClip[] number = new AudioClip[11];
    AudioClip plus;
    AudioClip equals;
    int sum, num1, num2;
    Thread runner;

    public void start() {
        if (runner == null) {
            runner = new Thread(this);
            runner.start();
        }
    }

    public void stop() {
        if (runner != null)
            runner = null;
    }

    public void init() {
        equals = getAudioClip(getCodeBase(), "equals.wav");
        plus = getAudioClip(getCodeBase(), "plus.wav");
        for (int i = 0; i < number.length; i++)
            number[i] = getAudioClip(getCodeBase(), "number" + i + ".wav");
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (runner == thisThread) {
            sum = (int) Math.floor(Math.random() * 10 + 1);
            num2 = (int) Math.floor(Math.random() * sum);
            num1 = sum - num2;
            repaint();
            number[num1].play();
            pause(600);
            plus.play();
            pause(600);
            number[num2].play();
            pause(600);
            equals.play();
            pause(600);
            number[sum].play();
            pause(5000);
        }
    }

    public void paint(Graphics screen) {
        super.paint(screen);
        int width = getSize().width;
        int height = getSize().height;
        Graphics2D screen2D = (Graphics2D) screen;
        screen2D.setColor(Color.white);
        screen2D.fillRect(0, 0, width, height);
        screen2D.setColor(Color.black);
        Font dialog = new Font("Dialog", Font.BOLD, 48);
        screen2D.setFont(dialog);
        screen2D.drawString(num1 + " + " + num2 + " = " + sum, width / 2 - 100, height / 2 - 25);
    }

    private void pause(int duration) {
        try {
            Thread.sleep(duration);
        } catch (InterruptedException e) { }
    }
}
  1. 创建一个名为 MathMan.html 的文件,并将以下代码复制到文件中:
<applet code="MathMan.class" height=50 width=80>
</applet>

通过以上步骤,你可以深入了解 Java 中字体、颜色和声音处理的相关知识,并通过实际项目进行实践。希望这些内容对你有所帮助!

2.9 Java 声音处理流程总结

为了更清晰地展示 Java 中声音处理的流程,下面给出 mermaid 格式的流程图:

graph LR
    A[开始] --> B[选择声音文件格式]
    B --> C{是否为小程序}
    C -- 是 --> D[使用 JApplet 类方法]
    C -- 否 --> E[使用 JApplet 类的静态方法]
    D --> F[简单播放: 调用 play() 方法]
    D --> G[加载到 AudioClip: 调用 getAudioClip() 方法]
    E --> H[加载到 AudioClip: 调用 newAudioClip() 方法]
    F --> I[声音播放一次]
    G --> J[控制播放: play()、loop()、stop()]
    H --> J
    J --> K[可实现声音混合]
    K --> L[可打包成 JAR 文件]
    L --> M[关联 JAR 文件到小程序]
    M --> N[运行程序]
    N --> O[结束]

2.10 声音处理的性能考虑

声音文件和动画一样,需要大量的处理时间。因此,将声音处理放在一个或多个线程中运行会更高效。例如在 LaughTrack 应用程序中, LaughButton 类的声音播放功能就是在一个线程中运行的(代码中的 run() 方法)。当调用 startPlaying() 方法时启动线程,调用 stopPlaying() 方法时停止线程,这些调用都在事件处理方法 actionPerformed() 中完成。

2.11 不同声音格式的特点对比

声音格式 特点 适用场景
AU 文件 简单的音频文件格式,兼容性较好 简单的音频播放,对音质要求不高的场景
AIFF 文件 无损音频格式,音质较好 需要高质量音频的场景
WAV 文件 常见的无损音频格式,支持多种采样率和位深度 一般的音频播放,如音效、语音等
MIDI 文件 文件体积小,可表示音乐的音符、乐器和响度 背景音乐、游戏音效等
Type 0 MIDI MIDI 格式的一种,常用于简单的音乐 简单的音乐播放
Type 1 MIDI MIDI 格式的一种,可包含多个音轨 复杂的音乐创作
RMF 一种 MIDI 相关格式 特定的 MIDI 应用场景

2.12 声音处理的错误处理

在处理声音文件时,可能会遇到各种错误,如文件找不到、URL 格式错误等。以下是一些常见错误及处理方法:
- 文件找不到 :在使用 getAudioClip() newAudioClip() 方法加载声音文件时,如果文件不存在,对象可能会为 null 。因此,在调用 AudioClip 对象的方法之前,需要检查对象是否为 null ,避免出现错误。例如:

if (laugh[i] != null) {
    laugh[i].play();
}
  • URL 格式错误 :在使用 URL 对象时,可能会出现 MalformedURLException 异常。需要将 URL 构造函数放在 try-catch 块中进行异常处理,如在 LaughButton 类中:
try {
    URL laughIn = new URL("file:laugh" + i + ".wav");
    laugh[i] = JApplet.newAudioClip(laughIn);
} catch (MalformedURLException e) { 
    // 处理异常
}

2.13 声音处理的拓展思路

  • 声音特效 :可以通过调整声音的音量、音调、音色等参数,实现更多的声音特效。例如,在 MathMan 小程序中,可以为不同的数字声音添加不同的音效,增加趣味性。
  • 多语言支持 :可以根据用户的语言设置,加载不同语言的声音文件,实现多语言的数学辅导。例如,除了英文的数字声音文件,还可以准备中文、法文等其他语言的声音文件。

2.14 总结

通过本文,我们详细介绍了 Java 中字体、颜色和声音处理的相关知识。在字体和颜色方面,我们学习了如何创建包含特定面板的应用程序,解答了常见问题,进行了知识测验,并开展了拓展活动。在声音处理方面,我们了解了 Java 支持的声音文件格式,掌握了简单声音播放、加载声音到 AudioClip 对象、控制声音播放、声音混合等操作,还学习了如何将文件打包成 Java 归档文件以及如何创建一个简单的数学辅导小程序。

希望这些内容能帮助你在 Java 编程中更好地运用字体、颜色和声音,开发出更具吸引力和交互性的程序。如果你在实践过程中遇到任何问题,欢迎随时探索和尝试,不断提升自己的编程能力。

2.15 实践建议

  • 动手实践 :按照文中的示例代码和步骤,亲自编写和运行程序,加深对知识的理解。
  • 拓展功能 :在现有示例的基础上,尝试添加新的功能,如改变声音的播放顺序、添加更多的声音文件等。
  • 参考资料 :虽然本文没有提及参考资料,但你可以在网上搜索更多关于 Java 声音处理的资料,进一步学习和探索。

通过不断的实践和学习,你将能够熟练掌握 Java 中字体、颜色和声音处理的技术,开发出更加优秀的 Java 程序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值