杰瑞科技汇

java的setvisible

setVisible(boolean b)

setVisible(boolean b)java.awt.Component 类中的一个方法,这意味着所有 Swing 和 AWT 的组件(如 JFrame, JPanel, JButton, JLabel 等)都拥有这个方法。

它的作用非常直接:

  • setVisible(true): 将组件显示在屏幕上。
  • setVisible(false): 从屏幕上隐藏组件(注意:这并不等同于销毁组件,它仍然存在于内存中)。

最常见的用法:显示和隐藏窗口 (JFrame)

对于初学者来说,最常接触的就是用它来控制主窗口的显示和隐藏。

显示窗口 (setVisible(true))

这是创建 GUI 应用程序的最后一步,在设置了窗口的所有属性(如大小、标题等)之后,你需要调用 setVisible(true) 来让它真正出现在屏幕上。

示例代码:

import javax.swing.JFrame;
import javax.swing.JLabel;
public class SimpleWindow {
    public static void main(String[] args) {
        // 1. 创建一个 JFrame 窗口对象
        JFrame frame = new JFrame("我的第一个窗口");
        // 2. 设置窗口关闭时的操作(非常重要!)
        // EXIT_ON_CLOSE 表示关闭窗口时,程序会完全退出
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 3. 设置窗口大小(宽度和高度,单位是像素)
        frame.setSize(400, 300);
        // 4. (可选)设置窗口在屏幕上的初始位置
        frame.setLocationRelativeTo(null); // null 表示居中显示
        // 5. 创建一个标签并添加到窗口中
        JLabel label = new JLabel("你好,Swing世界!", JLabel.CENTER);
        frame.add(label);
        // 6. 【关键步骤】让窗口显示出来!
        // 在调用这行代码之前,窗口对象虽然已经创建,但在屏幕上是不可见的。
        frame.setVisible(true);
    }
}

执行流程分析:

  1. 创建 JFrame 对象。
  2. 设置关闭操作、大小、位置等。
  3. 添加组件。
  4. 调用 frame.setVisible(true):Swing 的事件调度线程会接收到这个请求,并最终将窗口绘制在屏幕上,程序会一直运行,保持窗口的显示状态,直到你关闭它。

隐藏窗口 (setVisible(false))

当你调用 setVisible(false) 时,窗口会从屏幕上消失,但你的 Java 程序并没有结束,它仍在后台运行,只是你看不到界面了。

示例代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class HideWindowExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("隐藏窗口示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLayout(new java.awt.FlowLayout());
        JButton hideButton = new JButton("隐藏窗口");
        JButton showButton = new JButton("显示窗口"); // 这个按钮在窗口隐藏后无法点击
        hideButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("隐藏按钮被点击,窗口将消失...");
                frame.setVisible(false); // 隐藏窗口
                System.out.println("窗口已隐藏,但程序仍在运行。");
            }
        });
        frame.add(hideButton);
        frame.add(showButton);
        frame.setVisible(true);
    }
}

执行流程分析:

  1. 窗口正常显示,包含一个“隐藏窗口”按钮。
  2. 点击按钮,actionPerformed 方法被触发。
  3. frame.setVisible(false) 执行,窗口立即从屏幕上消失。
  4. 程序的控制权仍在 main 方法中,程序没有退出,如果你在后台查看 Java 进程,会发现它还在运行。
  5. 由于窗口被隐藏,你无法再与界面上的任何组件(包括“显示窗口”按钮)进行交互。

一个非常重要的注意事项:pack() 方法

在调用 setVisible(true) 之前,你通常需要确定窗口的大小,有两种主要方式:

  1. setSize(int width, int height): 手动指定窗口的精确像素大小。
  2. pack(): 自动计算并设置窗口的大小,使其恰好能容纳所有已添加的子组件及其首选大小。

强烈推荐在 setVisible(true) 之前调用 pack(),因为它能让你的布局管理器更有效地工作,确保组件不会被意外裁剪。

使用 pack() 的示例:

import javax.swing.*;
import java.awt.*;
public class PackExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Pack() 示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 使用布局管理器
        frame.setLayout(new FlowLayout());
        // 添加不同大小的组件
        frame.add(new JButton("一个按钮"));
        frame.add(new JLabel("这是一个标签"));
        frame.add(new JTextField(15)); // 一个15列宽的文本框
        // 【推荐】让窗口自动调整大小以适应所有组件
        frame.pack();
        // 最后显示窗口
        frame.setVisible(true);
    }
}

在这个例子中,如果你不调用 pack(),而只是调用 setSize(),你可能会发现文本框或标签被截断。pack() 确保了所有内容都能完整显示。


setVisible(false) vs dispose() vs System.exit(0)

这是一个非常容易混淆的知识点,理解它们的区别对于编写健壮的 GUI 程序至关重要。

方法 作用 程序状态 何时使用
setVisible(false) 隐藏窗口,窗口对象和所有资源都保留在内存中 程序继续运行 临时隐藏窗口,之后可能还会通过 setVisible(true) 再次显示它,显示一个登录窗口,登录成功后隐藏它,显示主界面。
dispose() 销毁窗口,释放该窗口及其所有子组件占用的本机屏幕资源(如操作系统窗口句柄),窗口对象可能仍存在于 Java 堆中,但已无法使用。 程序继续运行 当你确定不再需要这个窗口时,调用它来释放系统资源,防止内存泄漏,关闭一个“对话框后,应该调用 dispose()
System.exit(0) 终止整个 Java 虚拟机,所有线程都会被停止,所有内存(包括窗口对象)都会被回收。 程序完全退出 当用户关闭应用程序的主窗口时,通常调用此方法,这通常通过 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 来实现。
  • 暂时藏起来以后再用?用 setVisible(false)
  • 彻底关闭一个窗口并释放资源?用 dispose()
  • 关闭整个程序?用 System.exit(0) 或设置 setDefaultCloseOperation(EXIT_ON_CLOSE)

最佳实践

  1. 调用顺序:总是在完成所有窗口设置(添加组件、设置布局等)之后,最后调用 setVisible(true)
  2. 主线程main 方法(主线程)应该尽快完成其工作,然后退出,GUI 的创建和显示通常由事件调度线程负责,虽然上面的简单示例直接在 main 中调用 setVisible(true) 可以工作,但对于复杂应用,更推荐使用 SwingUtilities.invokeLater() 来确保线程安全。
  3. 资源管理:对于非主窗口(如对话框),当用户关闭它时,应调用 dispose() 来清理资源,对于主窗口,使用 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) 是一个好习惯,这样当用户关闭主窗口时,它会调用 dispose(),如果没有任何其他可见窗口,程序会自动退出。
// 更健壮的启动方式
public class RobustLaunch {
    public static void main(String[] args) {
        // 使用 invokeLater 确保 GUI 相关代码在事件调度线程上执行
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("健壮的窗口");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 推荐使用 DISPOSE_ON_CLOSE
                frame.add(new JLabel("这是一个更安全的启动方式。"));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
分享:
扫描分享到社交APP
上一篇
下一篇