
本文详细介绍了如何利用java swing的`joptionpane`组件作为应用程序的入口,根据用户选择(例如“设置”选项)来启动一个新的`jframe`窗口。该新窗口将展示一个实时更新的数字时钟,并允许用户控制计时器的启停以及显示文本的颜色,通过`javax.swing.timer`实现时间动态更新,并遵循swing的事件调度线程(edt)最佳实践。
在Java Swing应用程序开发中,我们经常需要提供一个初始的用户交互点,例如一个简单的对话框,让用户选择进入不同的功能模块。JOptionPane是实现这一目的的理想选择。本文将指导您如何从JOptionPane启动一个功能更丰富的JFrame,其中包含一个动态更新的计时器。
JOptionPane可以在非事件调度线程(EDT)中安全地调用,因此通常在main方法中进行初始化。showOptionDialog方法允许我们自定义对话框的选项按钮。当用户点击其中一个选项时,该方法会返回一个整数值,代表被点击按钮的索引或预定义的常量。
在我们的场景中,我们需要一个包含“Settings”和“Close”两个选项的对话框。当用户选择“Settings”时,将启动一个新的JFrame。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class DynamicClockApp {
private static final String SETTINGS = "Settings";
private static final String CLOSE = "Close";
private JButton startButton;
private JButton stopButton;
private JFrame frame;
private JLabel timeLabel;
private Timer swingTimer; // 使用javax.swing.Timer
public DynamicClockApp() {
// 初始化Swing Timer,每秒触发一次ActionEvent
// setDelay(0) 会在第一次触发后立即执行,然后按延迟时间继续
swingTimer = new Timer(1000, this::updateTimer);
swingTimer.setInitialDelay(0); // 确保计时器立即开始更新
}
/**
* 构建并显示主应用程序界面(JFrame)。
*/
private void buildAndDisplayGui() {
frame = new JFrame("动态计时器应用");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
// 创建显示时间的标签
timeLabel = new JLabel(getCurrentTime(), SwingConstants.CENTER);
timeLabel.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
timeLabel.setForeground(Color.RED); // 初始颜色为红色
timeLabel.setFont(new Font("SansSerif", Font.BOLD, 48)); // 设置字体大小
timeLabel.setToolTipText("计时器当前已停止。");
frame.add(timeLabel, BorderLayout.CENTER); // 将标签添加到窗口中央
frame.add(createControlButtons(), BorderLayout.PAGE_END); // 将控制按钮添加到窗口底部
frame.pack(); // 调整窗口大小以适应其组件
frame.setLocationByPlatform(true); // 让操作系统决定窗口位置
frame.setVisible(true); // 显示窗口
}
/**
* 创建并返回包含控制按钮的面板。
*/
private JPanel createControlButtons() {
JPanel panel = new JPanel();
startButton = new JButton("启动");
startButton.setMnemonic(KeyEvent.VK_S); // 设置快捷键 Alt+S
startButton.setToolTipText("启动计时器。");
startButton.addActionListener(this::startTimer); // 添加启动事件监听
panel.add(startButton);
stopButton = new JButton("停止");
stopButton.setMnemonic(KeyEvent.VK_P); // 设置快捷键 Alt+P
stopButton.setToolTipText("停止计时器。");
stopButton.addActionListener(this::stopTimer); // 添加停止事件监听
stopButton.setEnabled(false); // 初始状态下停止按钮禁用
panel.add(stopButton);
return panel;
}
/**
* 获取当前时间,并格式化为 HH:mm:ss。
*/
private String getCurrentTime() {
return LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ENGLISH));
}
/**
* 启动计时器。
*/
private void startTimer(ActionEvent event) {
timeLabel.setToolTipText(null);
timeLabel.setForeground(Color.BLACK); // 启动时颜色变为黑色
startButton.setEnabled(false); // 启动按钮禁用
swingTimer.start(); // 启动Swing计时器
stopButton.setEnabled(true); // 停止按钮启用
}
/**
* 停止计时器。
*/
private void stopTimer(ActionEvent event) {
swingTimer.stop(); // 停止Swing计时器
timeLabel.setForeground(Color.RED); // 停止时颜色变为红色
timeLabel.setToolTipText("计时器当前已停止。");
startButton.setEnabled(true); // 启动按钮启用
stopButton.setEnabled(false); // 停止按钮禁用
}
/**
* 更新时间标签的文本。
*/
private void updateTimer(ActionEvent event) {
timeLabel.setText(getCurrentTime());
}
public static void main(String[] args) {
// 显示选项对话框
int choice = JOptionPane.showOptionDialog(null,
"请选择操作:",
"选项对话框",
JOptionPane.YES_NO_OPTION, // 只有两个选项
JOptionPane.QUESTION_MESSAGE,
null,
new String[]{SETTINGS, CLOSE}, // 自定义按钮文本
SETTINGS); // 默认选中按钮
// 根据用户选择进行处理
if (choice == JOptionPane.YES_OPTION) { // 如果选择了“Settings”
// 尝试设置系统默认外观,以使界面更符合操作系统风格
String systemLookAndFeel = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(systemLookAndFeel);
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException x) {
System.out.println("警告 (已忽略): 无法设置系统外观。");
}
// 在事件调度线程中构建并显示GUI
EventQueue.invokeLater(() -> new DynamicClockApp().buildAndDisplayGui());
} else { // 如果选择了“Close”或关闭了对话框
System.exit(0); // 退出应用程序
}
}
}当用户在JOptionPane中选择“Settings”后,我们将创建一个新的JFrame来承载动态计时器。
立即学习“Java免费学习笔记(深入)”;
JFrame是Swing的顶级容器,用于创建应用程序主窗口。
JLabel用于显示文本信息。
为了实现每秒更新时间的功能,我们使用javax.swing.Timer。
我们添加“启动”和“停止”按钮来控制计时器的状态。
通过本文,我们学习了如何利用JOptionPane作为Java Swing应用程序的初始交互点,并根据用户选择动态启动一个功能丰富的JFrame。这个JFrame展示了一个实时更新的数字时钟,并通过javax.swing.Timer实现了每秒更新,同时提供了启动和停止计时器的功能,并根据状态改变显示文本的颜色。整个过程遵循了Swing的EDT最佳实践,确保了应用的稳定性和响应性。这些技术是构建用户友好且响应迅速的Swing应用程序的基础。
以上就是Java Swing:利用JOptionPane启动动态计时器应用界面的详细内容,更多请关注php中文网其它相关文章!
Windows激活工具是正版认证的激活工具,永久激活,一键解决windows许可证即将过期。可激活win7系统、win8.1系统、win10系统、win11系统。下载后先看完视频激活教程,再进行操作,100%激活成功。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号