59、Java Applets与JavaFX GUI应用开发全解析

Java Applets与JavaFX GUI应用开发全解析

1. Java Applets基础

Java Applets是一种可以嵌入到网页中的小型Java程序,能为网页增添动态和交互性。下面我们来了解一些Applets开发中的关键知识点。

1.1 播放音频文件

在Applets中,有多种方式可以播放音频文件。可以使用Applet类的 play 方法,也可以使用 AudioClip 对象。
- play 方法 :此方法可用于加载并播放音频文件,播放一次后会释放占用的内存以进行垃圾回收。
- AudioClip 对象 :它有 play loop stop 等方法。 play 方法用于播放音频, loop 方法用于循环播放, stop 方法用于停止播放。

支持的音频文件格式包括 .au (Sun Audio File)、 .mid .rmi (MIDI File)、 .wav (Windows Wave File)。

1.2 Applet类的重要方法
  • init 方法 :该方法在Applet初始化时调用,类似于GUI应用类的构造函数。
  • getDocumentBase getCodeBase 方法 getDocumentBase 方法返回调用Applet的HTML文件的URL对象, getCodeBase 方法返回Applet的 .class 文件的URL对象。
1.3 常见错误避免

在开发Applets时,需要注意以下常见错误:
- HTML标签问题
- 忘记HTML文档中的结束标签,大多数HTML标签都有开始标签和结束标签,忘记结束标签会导致页面显示不正常。
- 混淆 <head></head> 标签和 <h1></h1> 等标题标签, <head></head> 标签标记文档的头部部分,而 <h1></h1> 标签标记标题,是大字体的粗体文本。
- 图形绘制问题
- 绘制形状时使用的X和/或Y坐标超出组件范围,这样形状将不会显示。
- 重写 paint paintComponent 方法时,未调用超类的相应方法,重写方法应在执行其他操作之前调用超类的版本。
- 用从 JComponent 扩展的组件重写 paint 方法,应仅对AWT组件、 JFrame 组件或 JApplet 组件重写 paint 方法。
- 更新用于在组件上绘制形状的数据后,未调用 repaint 方法来强制调用 paint paintComponent 方法。
- 监听器问题
- 编写鼠标监听器或鼠标移动监听器时,未为不需要的方法提供空定义,必须为监听器接口指定的所有方法提供定义,可通过继承适配器类来避免。
- Timer对象问题 :忘记启动 Timer 对象, Timer 对象在调用其 start 方法启动之前不会开始生成动作事件。

2. 练习题与解答

下面是一些关于Applets的练习题及解答,帮助大家巩固知识。

2.1 选择题
题目 选项 答案
HTML文档的哪个部分包含所有在浏览器窗口中产生输出的标签和文本? a. head
b. content
c. body
d. output
c
哪个标签会在插入点处显示一条水平线? a. <hr/>
b. <br/>
c. <p/>
d. <head>
a
HTML文档中,出现在哪对标签之间的所有内容是网页的内容? a. <content></content>
b. <html></html>
c. <head></head>
d. <page></page>
b
Applets支持哪些音频文件格式来存储音频? a..au (Sun Audio File)
b. mid或.rmi (MIDI File)
c. wav (Windows Wave File)
d. 以上所有
d
鼠标按钮按下后释放时调用哪个方法? a. mouseReleased
b. mouseEntered
c. mouseClicked
d. mousePressed
a
哪种组件能确保Applet与所有支持Java的浏览器兼容? a. Swing
b. AWT
c. JFrame
d. HTML
a
哪个Applet方法代替构造函数被调用? a. startUp
b. beginApplet
c. invoke
d. init
d
Sun JDK附带的哪个程序可以在不使用Web浏览器的情况下加载和执行Applet? a. applettest
b. appletload
c. appletviewer
d. viewapplet
c
继承自Applet或Frame的类没有以下哪一项? a. an add方法
b. an init方法
c. a content pane
d. a layout manager
c
Graphics类的哪个方法用于设置字体? a. setFont
b. setLayout
c. drawString
d. setColor
a
在扩展JApplet或JFrame的类中,重写哪个方法以获取Graphics对象的引用? a. paint
b. paintComponent
c. getGraphics
d. graphics
a
在扩展JPanel的类中,重写哪个方法以获取Graphics对象的引用? a. paint
b. paintComponent
c. getGraphics
d. graphics
b
drawLine 方法是哪个类的成员? a. JApplet
b. Applet
c. JFrame
d. Graphics
d
为了强制调用 paint 方法来更新组件的显示,应该怎么做? a. 调用 paint 方法
b. 调用 repaint 方法
c. 调用 paintAgain 方法
d. 什么都不做;无法强制调用 paint 方法
b
实现哪个接口的类可以处理鼠标拖动事件? a. MouseListener
b. ActionListener
c. MouseMotionListener
d. MouseDragListener
c
Applet类的哪个方法类似于GUI应用类的构造函数? a. init
b. pack
c. applet
d. setVisible
a
MouseEvent类的哪个方法返回鼠标事件生成时鼠标光标的X坐标? a. getXCoord
b. getMouseX
c. getPosition
d. getX
d
如果一个类实现了一个指定多个方法的标准API接口,但不需要其中很多方法,应该使用什么代替该接口? a. 自己详细实现所需的方法
b. 适配器类
c. 不同的接口
d. 没有其他选择
b
Timer对象的事件时间间隔以什么单位指定? a. 秒
b. 微秒
c. 毫秒
d. 分钟
c
Timer类的哪个方法在Timer对象运行时返回 true a. isRunning
b. addActionListener
c. start
d. getDelay
a
Applet类的哪个方法返回调用Applet的HTML文件位置的URL对象? a. getHTMLlocation
b. getDocumentBase
c. getAppletBase
d. getCodeBase
b
Applet类的哪个方法返回Applet的 .class 文件位置的URL对象? a. getHTMLlocation
b. getDocumentBase
c. getAppletBase
d. getCodeBase
d
1.2 判断题
  • 一个Applet类继承自 JApplet ,而 JApplet 类是 javax.swing 包的一部分。(True)
  • 超文本可以包含指向同一网页中其他位置的链接。(True)
  • Applets不能与除传输它的服务器之外的任何系统建立网络连接。(True)
  • Applets可以检索有关用户系统或用户身份的信息。(False)
  • <h1/> 标签用于标记文档的头部部分。(False)
  • 使用静态 main 方法来创建Applet类的实例。(False)
  • 在扩展 JApplet 的类中,将组件添加到内容面板。(True)
  • 在Applet中,事件处理方式与GUI应用不同。(False)
  • Frame 类的对象没有内容面板。(True)
  • 在重写的 paint 方法中,不应调用超类的 paint 方法。(False)
  • 一旦 Timer 对象启动,不关闭程序就无法停止。(False)
  • Applet类的 play 方法加载并播放音频文件一次,然后释放其占用的内存以进行垃圾回收。(True)
  • 用于音频文件的 loop stop 方法是Applet类的一部分。(False)
1.3 错误查找

以下是一些代码中的错误及修正建议:

// 错误代码1
<applet code="MyApplet.java" width=100 height=50>
</applet>
// 错误原因:code属性应指定编译后的.class文件,而不是.java文件
// 修正后
<applet code="MyApplet.class" width=100 height=50>
</applet>

// 错误代码2
public void paint(Graphics g)
{
   drawLine(0, 0, 100, 100);
}
// 错误原因:未指定drawLine方法所属的对象,应使用g.drawLine
// 修正后
public void paint(Graphics g)
{
   g.drawLine(0, 0, 100, 100);
}

// 错误代码3
// Call a method to draw a filled polygon
fillPolygon(xCoords, yCoords,);
// 错误原因:方法调用中多余的逗号,且未指定方法所属的对象
// 修正后
g.fillPolygon(xCoords, yCoords);

// 错误代码4
public class MyPanel extends JPanel
{
   public MyPanel()
   {
      // Constructor code...
   }
   public void paint(Graphics g)
   {
      //paint method code...
   {
}
// 错误原因:方法结束处的括号不匹配
// 修正后
public class MyPanel extends JPanel
{
   public MyPanel()
   {
      // Constructor code...
   }
   public void paint(Graphics g)
   {
      //paint method code...
   }
}

// 错误代码5
private class MyMouseListener implements MouseListener
{
   public void mouseClicked(MouseEvent e)
   {
      mouseClicks += 1;
   }
}
// 错误原因:实现MouseListener接口时,未为所有方法提供定义
// 修正后
private class MyMouseListener implements MouseListener
{
   public void mouseClicked(MouseEvent e)
   {
      mouseClicks += 1;
   }
   public void mousePressed(MouseEvent e) {}
   public void mouseReleased(MouseEvent e) {}
   public void mouseEntered(MouseEvent e) {}
   public void mouseExited(MouseEvent e) {}
}

// 错误代码6
// Is there any statement missing in order to initialize //the timer object?
public void init()
{
   timer = new Timer(40, new TimerListener());
}
// 错误原因:创建Timer对象后未启动
// 修正后
public void init()
{
   timer = new Timer(40, new TimerListener());
   timer.start();
}
1.4 算法工作台
  • 创建HTML标签 :要显示文本“Games”并加粗斜体,可以使用 <b><i>Games</i></b> 标签。
  • 执行Applet的HTML标签 :假设Applet代码保存在 MyApplet.java 文件中,编译后的代码与HTML文档在同一目录下,可使用以下标签执行Applet:
<applet code="MyApplet.class" width=300 height=200>
</applet>
  • 将GUI应用转换为Applet :以下是将一个简单的GUI应用转换为Applet的步骤及代码示例。
// 原GUI应用类
public class SimpleWindow extends JFrame
{
    public SimpleWindow()
    {
        // Set the title.
        setTitle("A Simple Window");

        // Specify what happens when the close button is clicked.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Add a label.
        JLabel label = new JLabel("This is a simple window.");
        add(label);

        // Pack and display the window.
        pack();
        setVisible(true);
    }
}

// 转换为Applet后的代码
import javax.swing.*;
import java.awt.*;

public class SimpleApplet extends JApplet
{
    public void init()
    {
        // Set the title. (Applet没有标题设置,可忽略)

        // 不需要设置关闭操作

        // Add a label.
        JLabel label = new JLabel("This is a simple applet.");
        getContentPane().add(label);

        // 不需要pack和setVisible
    }
}
  • Graphics对象绘图代码 :假设 g 引用一个 Graphics 对象,以下是实现各种绘图操作的代码。
// a. 绘制一个宽100像素、高200像素的矩形轮廓,左上角坐标为(50, 75)
g.drawRect(50, 75, 100, 200);

// b. 绘制一个宽300像素、高100像素的填充矩形,左上角坐标为(10, 90)
g.setColor(Color.BLACK);
g.fillRect(10, 90, 300, 100);

// c. 绘制一个蓝色椭圆轮廓,其包围矩形宽100像素、高50像素,左上角坐标为(10, 25)
g.setColor(Color.BLUE);
g.drawOval(10, 25, 100, 50);

// d. 绘制一条从(0, 5)到(150, 175)的红色线条
g.setColor(Color.RED);
g.drawLine(0, 5, 150, 175);

// e. 绘制字符串“Greetings Earthling”,字符串左下角点坐标为(80, 99),使用加粗20点的 serif 字体
g.setFont(new Font("Serif", Font.BOLD, 20));
g.drawString("Greetings Earthling", 80, 99);

// f. 绘制一个多边形,顶点坐标为(10, 10)、(10, 25)、(50, 25)和(50, 10)
int[] xCoords = {10, 10, 50, 50};
int[] yCoords = {10, 25, 25, 10};
g.drawPolygon(xCoords, yCoords, 4);
// 该代码绘制的是一个矩形
  • 使用适配器类重写鼠标移动监听器
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

private class MyMouseMotionListener extends MouseAdapter
{
    @Override
    public void mouseMoved(MouseEvent e)
    {
        mouseMovements += 1;
    }
}
  • 创建并注册 Timer 对象
import javax.swing.Timer;

// 假设类中有一个内部类MyTimerListener
private class MyTimerListener implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // 处理事件
    }
}

// 创建并注册Timer对象
Timer timer = new Timer(500, new MyTimerListener());
timer.start();
2. JavaFX基础

JavaFX是Java的下一代GUI工具包,可用于创建丰富的图形化应用程序。下面我们来了解JavaFX的相关知识。

2.1 JavaFX简介

JavaFX是一个标准的Java库,从Java 7开始完全集成到Java中。它可用于创建GUI应用程序、显示2D和3D图形,能开发运行在本地计算机的独立图形应用程序、从远程服务器运行的应用程序或嵌入网页的应用程序。

与Swing相比,JavaFX是Java库中相对较新的部分,虽然它不会取代Swing,但代表了Java GUI工具包的下一代发展方向。

GUI是应用程序呈现给用户进行交互的图形窗口或图形窗口系统,除了接受键盘输入外,通常还接受鼠标或触摸屏输入。

常见的GUI组件包括按钮( Button )、标签( Label )、文本框( TextField )、复选框( CheckBox )和单选按钮( RadioButton )等。

以下是一些常见GUI组件的说明:
|组件|描述|
| ---- | ---- |
| AnchorPane |其他组件的容器,内部组件可固定在距 AnchorPane 一个或多个边缘的特定距离处。|
| Button |点击时可触发操作的按钮。|
| CheckBox |有一个可勾选或取消勾选的框的组件。|
| ComboBox |显示下拉列表供用户选择项目的组件,还提供一个文本框供用户输入,兼具列表和文本框的功能。|
| Label |可显示文本的区域。|
| List |用户可从中选择项目的列表。|
| RadioButton |可选中或取消选中的组件,通常成组出现,允许用户从多个选项中选择一个。|
| Slider |用户可通过沿轨道移动滑块来选择值的组件。|
| TextField |用户可从键盘输入单行文本的区域。|
| TitledPane |其他组件的容器,顶部有一个标题栏可显示标题,可关闭或打开。|

2.2 场景图(Scene Graphs)

在JavaFX中,GUI中的组件通过场景图进行组织。场景图是一种树状的层次数据结构,包含节点。

场景图有三种类型的节点:
- 根节点(Root Node) :场景图中只能有一个根节点,它是场景图中所有其他节点的父节点,是结构中的第一个节点。
- 分支节点(Branch Node) :可以有其他节点作为子节点的节点。
- 叶子节点(Leaf Node) :不能有子节点的节点。

在JavaFX中,能有子节点的节点是容器,可容纳其他组件。 AnchorPane 容器常被用作GUI的根节点。

例如,一个简单的GUI可能包含一个 AnchorPane 作为根节点,其中包含一个 Pane (分支节点)和一个 Button (叶子节点),而 Pane 中又包含一个 Label 和两个 RadioButton (叶子节点)。

以下是一个简单的场景图示例:

graph TD
    A[AnchorPane(根节点)] --> B[Pane(分支节点)]
    A --> C[Button(叶子节点)]
    B --> D[Label(叶子节点)]
    B --> E[RadioButton(叶子节点)]
    B --> F[RadioButton(叶子节点)]

在更复杂的GUI中,可能有一个 AnchorPane 作为根节点,包含一个 TitledPane (分支节点)和一个 Button (叶子节点), TitledPane 中又包含另一个 AnchorPane (分支节点),该 AnchorPane 中包含三个 RadioButton (叶子节点)。

graph TD
    A[AnchorPane(根节点)] --> B[TitledPane(分支节点)]
    A --> C[Button(叶子节点)]
    B --> D[AnchorPane(分支节点)]
    D --> E[RadioButton(叶子节点)]
    D --> F[RadioButton(叶子节点)]
    D --> G[RadioButton(叶子节点)]
2.3 事件驱动编程

在GUI环境中运行的程序必须是事件驱动的。事件是程序中发生的动作,如按钮点击。编写GUI应用程序的一部分工作是创建事件监听器,事件监听器是在特定事件发生时自动执行的方法。

例如,当用户点击按钮时,可创建一个事件监听器来响应这个点击事件,执行相应的操作。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(e -> System.out.println("Hello World!"));

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在上述代码中,当用户点击按钮时,会触发 setOnAction 方法中定义的事件监听器,在控制台输出“Hello World!”。

通过以上内容,我们对Java Applets和JavaFX的基础知识有了较为全面的了解。无论是Applets的音频播放、方法使用,还是JavaFX的场景图组织和事件驱动编程,都是开发Java图形化应用的重要内容。希望这些知识能帮助你更好地进行Java应用开发。

3. JavaFX应用开发实践
3.1 使用Scene Builder创建JavaFX应用

Scene Builder是一个可视化的工具,可帮助我们更轻松地创建JavaFX应用的界面。以下是使用Scene Builder创建JavaFX应用的基本步骤:
1. 安装Scene Builder :从官方网站下载并安装Scene Builder。
2. 创建FXML文件 :FXML是一种基于XML的标记语言,用于定义JavaFX应用的用户界面。在Scene Builder中创建一个新的FXML文件。
3. 设计界面 :从组件库中拖放所需的组件到设计区域,如按钮、标签、文本框等,并进行布局调整。
4. 设置组件属性 :通过属性面板设置组件的各种属性,如文本内容、大小、颜色等。
5. 保存FXML文件 :将设计好的界面保存为FXML文件。

以下是一个简单的FXML文件示例:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" alignment="CENTER" spacing="20">
    <Label text="Welcome to JavaFX!" />
    <Button text="Click Me" />
</VBox>
3.2 编写应用代码

在创建好FXML文件后,需要编写Java代码来加载和显示这个界面。以下是一个简单的Java代码示例:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class JavaFXApp extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
        // 加载FXML文件
        FXMLLoader fxmlLoader = new FXMLLoader(JavaFXApp.class.getResource("example.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 300, 200);

        // 设置舞台标题
        primaryStage.setTitle("JavaFX App");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在上述代码中,首先使用 FXMLLoader 加载FXML文件,然后创建一个 Scene 对象,并将其设置到 Stage 上,最后显示舞台。

3.3 处理事件

在JavaFX应用中,处理事件是非常重要的。以下是一个处理按钮点击事件的示例:

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;

import java.io.IOException;

public class EventHandlingApp extends Application {

    @FXML
    private Label messageLabel;

    @FXML
    private Button clickButton;

    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(EventHandlingApp.class.getResource("event_example.fxml"));
        fxmlLoader.setController(this);
        Scene scene = new Scene(fxmlLoader.load(), 300, 200);

        primaryStage.setTitle("Event Handling App");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @FXML
    private void handleButtonClick() {
        messageLabel.setText("Button clicked!");
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在上述代码中,使用 @FXML 注解将FXML文件中的组件注入到Java代码中,然后在 handleButtonClick 方法中处理按钮点击事件,当按钮被点击时,更新标签的文本内容。

4. 综合案例:开发一个简单的计算器应用

下面我们通过一个综合案例,开发一个简单的计算器应用,来巩固前面所学的知识。

4.1 设计界面

使用Scene Builder设计计算器的界面,包含数字按钮、运算符按钮、显示结果的文本框等。以下是对应的FXML文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.GridPane?>

<GridPane xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" alignment="CENTER" hgap="10" vgap="10">
    <TextField fx:id="resultField" GridPane.columnIndex="0" GridPane.columnSpan="4" GridPane.rowIndex="0" editable="false" />
    <Button text="7" GridPane.columnIndex="0" GridPane.rowIndex="1" onAction="#handleNumberClick" />
    <Button text="8" GridPane.columnIndex="1" GridPane.rowIndex="1" onAction="#handleNumberClick" />
    <Button text="9" GridPane.columnIndex="2" GridPane.rowIndex="1" onAction="#handleNumberClick" />
    <Button text="/" GridPane.columnIndex="3" GridPane.rowIndex="1" onAction="#handleOperatorClick" />
    <Button text="4" GridPane.columnIndex="0" GridPane.rowIndex="2" onAction="#handleNumberClick" />
    <Button text="5" GridPane.columnIndex="1" GridPane.rowIndex="2" onAction="#handleNumberClick" />
    <Button text="6" GridPane.columnIndex="2" GridPane.rowIndex="2" onAction="#handleNumberClick" />
    <Button text="*" GridPane.columnIndex="3" GridPane.rowIndex="2" onAction="#handleOperatorClick" />
    <Button text="1" GridPane.columnIndex="0" GridPane.rowIndex="3" onAction="#handleNumberClick" />
    <Button text="2" GridPane.columnIndex="1" GridPane.rowIndex="3" onAction="#handleNumberClick" />
    <Button text="3" GridPane.columnIndex="2" GridPane.rowIndex="3" onAction="#handleNumberClick" />
    <Button text="-" GridPane.columnIndex="3" GridPane.rowIndex="3" onAction="#handleOperatorClick" />
    <Button text="0" GridPane.columnIndex="0" GridPane.rowIndex="4" onAction="#handleNumberClick" />
    <Button text="." GridPane.columnIndex="1" GridPane.rowIndex="4" onAction="#handleNumberClick" />
    <Button text="=" GridPane.columnIndex="2" GridPane.rowIndex="4" onAction="#handleEqualsClick" />
    <Button text="+" GridPane.columnIndex="3" GridPane.rowIndex="4" onAction="#handleOperatorClick" />
</GridPane>
4.2 编写控制器代码

创建一个控制器类来处理按钮点击事件和计算逻辑。

import javafx.fxml.FXML;
import javafx.scene.control.TextField;

import java.util.Stack;

public class CalculatorController {

    @FXML
    private TextField resultField;

    private Stack<Double> numbers = new Stack<>();
    private Stack<Character> operators = new Stack<>();

    @FXML
    private void handleNumberClick(javafx.event.ActionEvent event) {
        Button source = (Button) event.getSource();
        String number = source.getText();
        resultField.setText(resultField.getText() + number);
    }

    @FXML
    private void handleOperatorClick(javafx.event.ActionEvent event) {
        Button source = (Button) event.getSource();
        char operator = source.getText().charAt(0);
        // 处理运算符逻辑
        // 这里可以添加具体的运算符处理代码
    }

    @FXML
    private void handleEqualsClick(javafx.event.ActionEvent event) {
        // 处理等于号逻辑
        // 这里可以添加具体的计算逻辑
    }
}
4.3 加载界面和控制器

编写主类来加载FXML文件和控制器。

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class CalculatorApp extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(CalculatorApp.class.getResource("calculator.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 300, 400);

        primaryStage.setTitle("Calculator App");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
5. 总结

通过以上内容,我们系统地学习了Java Applets和JavaFX的相关知识。

对于Java Applets,我们了解了其音频播放的方法,掌握了Applet类的重要方法,如 init getDocumentBase getCodeBase 等。同时,也学习了如何避免开发过程中的常见错误,通过练习题和算法工作台的实践,巩固了Applets开发的知识。

对于JavaFX,我们从基础概念入手,了解了JavaFX的特点和优势,学习了场景图的组织方式和事件驱动编程的原理。通过使用Scene Builder创建界面、编写应用代码和处理事件,掌握了JavaFX应用开发的基本流程。最后,通过开发一个简单的计算器应用,将所学知识进行了综合应用。

在实际开发中,我们可以根据项目的需求选择合适的技术。如果需要开发嵌入网页的小型交互程序,可以选择Java Applets;如果要创建功能丰富、界面美观的独立应用程序,JavaFX则是更好的选择。希望大家通过学习这些知识,能够在Java图形化应用开发的道路上取得更好的成果。

以下是一个简单的流程图,展示了JavaFX应用开发的基本流程:

graph LR
    A[需求分析] --> B[设计界面]
    B --> C[使用Scene Builder创建FXML文件]
    C --> D[编写Java代码加载FXML文件]
    D --> E[处理事件和业务逻辑]
    E --> F[测试和优化]

同时,为了方便大家回顾,这里列出Java Applets和JavaFX的关键知识点对比:
| 对比项 | Java Applets | JavaFX |
| ---- | ---- | ---- |
| 应用场景 | 嵌入网页的小型交互程序 | 独立的GUI应用、2D/3D图形应用 |
| 音频播放 | 使用 play 方法或 AudioClip 对象 | 有专门的音频播放类 |
| 界面设计 | 代码编写为主 | 可使用Scene Builder可视化设计 |
| 事件处理 | 传统的事件监听器 | 基于lambda表达式的事件处理 |
| 组件 | 相对较少 | 丰富的组件库 |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值