一、总概述
JavaFX 和 JFrame 是两个不同的框架,用于创建图形用户界面(GUI)。JavaFX 是一个用于创建丰富客户端应用程序的现代框架,而 JFrame 是 Swing 框架的一部分,Swing 是 Java 早期的 GUI 框架。
在 JavaFX 中,没有直接等价于 JFrame 的类。
但是,JavaFX 提供了一个名为 `Stage` 的类,它可以用作应用程序的主窗口。`Stage` 类提供了类似于 JFrame 的功能,如设置标题、大小、位置等。
** 以下是一个简单的 JavaFX 应用程序示例,它创建了一个类似于 JFrame 的窗口: **
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class JavaFXExample extends Application {
@Override
public void start(Stage stage) {
// 创建一个标签
Label label = new Label("Hello, JavaFX!");
// 创建一个布局容器并添加标签
StackPane root = new StackPane();
root.getChildren().add(label);
// 创建一个场景
Scene scene = new Scene(root, 300, 200);
// 设置场景到舞台
stage.setScene(scene);
// 设置窗口标题
stage.setTitle("JavaFX Example");
// 显示窗口
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这个示例创建了一个简单的 JavaFX 应用程序,它显示一个包含 "Hello, JavaFX!" 文本的窗口。
虽然这个示例没有直接使用 JFrame,但它展示了如何使用 JavaFX 创建类似的窗口。
如果你需要在 JavaFX 应用程序中使用 Swing 组件,可以使用 `SwingNode` 类将 Swing 组件嵌入到 JavaFX 场景中。
二、JFrame知识点
1. 创建 JFrame:要创建一个 JFrame,只需实例化一个 JFrame 对象并设置相关属性,如标题、大小等。
JFrame frame = new JFrame("My JFrame");
//设置尺寸
frame.setSize(400, 300);
//设置关闭样式
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//可视化
frame.setVisible(true);
2. 设置窗口属性:可以设置 JFrame 的各种属性,如标题、大小、位置、图标等。
frame.setTitle("My JFrame");
frame.setSize(400, 300);
//设置位置
frame.setLocation(100, 100);
//引入图片
frame.setIconImage(new ImageIcon("icon.png").getImage());
3. 设置关闭操作:可以设置 JFrame 的默认关闭操作,如隐藏、退出等。
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
4. 添加组件:可以向 JFrame 添加 Swing 组件,如按钮、文本框等。
通常需要使用布局管理器(如 BorderLayout、FlowLayout 等)来管理组件的位置和大小。
JButton button = new JButton("Click me");
frame.getContentPane().add(button, BorderLayout.SOUTH);
5. 事件处理:可以为 JFrame 或其组件添加事件监听器,以响应用户操作。
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked");
}
});
6. 设置菜单栏:可以为 JFrame 设置菜单栏,包括菜单和菜单项。
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem exitItem = new JMenuItem("Exit");
fileMenu.add(exitItem);
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
7. 设置状态栏:可以为 JFrame 设置状态栏,用于显示应用程序状态信息。
JLabel statusLabel = new JLabel("Ready");
frame.getContentPane().add(statusLabel, BorderLayout.SOUTH);
8. 设置图标:可以为 JFrame 设置图标,以便在任务栏或窗口标题栏中显示。
frame.setIconImage(new ImageIcon("icon.png").getImage());
9. 设置透明度:可以设置 JFrame 的透明度,使其半透明或完全透明。
frame.setBackground(new Color(0, 0, 0, 0));
frame.setOpacity(0.5f);
10. 设置全屏模式:可以设置 JFrame 以全屏模式显示。
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
三、JFrame(paint)重点介绍:
在 JFrame 中,`paint` 方法是用于绘制组件内容的方法。
当 JFrame 需要重绘其内容时,例如在窗口大小改变、最小化后恢复等情况下,`paint` 方法会被自动调用。
要在 JFrame 中绘制自定义内容,可以重写 `paint` 方法并在其中使用 `Graphics` 对象进行绘制。
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color;
public class CustomJFrame extends JFrame {
public CustomJFrame() {
setTitle("Custom JFrame");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void paint(Graphics g) {
// 调用父类的 paint 方法以绘制默认内容
super.paint(g);
// 设置绘制颜色
g.setColor(Color.RED);
// 绘制一个矩形
g.fillRect(50, 50, 100, 100);
}
public static void main(String[] args) {
new CustomJFrame();
}
}
在这个示例中,我们创建了一个自定义的 JFrame 类 `CustomJFrame`,并重写了 `paint` 方法。
在 `paint` 方法中,我们首先调用了父类的 `paint` 方法以绘制默认内容,然后设置了绘制颜色为红色,并绘制了一个矩形。
需要注意的是,直接重写 `paint` 方法并进行绘制可能会导致性能问题,特别是在需要频繁重绘的情况下。为了提高性能,可以考虑使用 `paintComponent` 方法进行绘制,这需要创建一个继承自 `JPanel` 的自定义面板类,并在该类中重写 `paintComponent` 方法。然后将自定义面板添加到 JFrame 中即可。以下是使用 `paintComponent` 方法的示例:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
public class CustomJFrame extends JFrame {
public CustomJFrame() {
setTitle("Custom JFrame");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个自定义面板并添加到 JFrame 中
CustomPanel panel = new CustomPanel();
getContentPane().add(panel);
setVisible(true);
}
public static void main(String[] args) {
new CustomJFrame();
}
}
class CustomPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
// 调用父类的 paintComponent 方法以绘制默认内容
super.paintComponent(g);
// 设置绘制颜色
g.setColor(Color.RED);
// 绘制一个矩形
g.fillRect(50, 50, 100, 100);
}
}
在实例中创建了一个自定义的 JPanel 类 `CustomPanel`,并重写了 `paintComponent` 方法。
在 `paintComponent` 方法中,我们首先调用了父类的 `paintComponent` 方法以绘制默认内容,
然后设置了绘制颜色为红色,并绘制了一个矩形。
最后,我们将自定义面板添加到 JFrame 中。这种方法更推荐,因为它可以提高性能并更好地支持 Swing 的事件处理机制