-
2021-03-16 19:19:39
我创建了一个JavaFX项目,并在Java Scene Builder中为第一个登录框架创建了GUI。成功登录后,必须关闭登录框架,并且下一个框架必须可见(主程序框架)。我可以使新框架出现,但不能使登录框架关闭。我尝试了dispose()之类的东西,但没有任何效果。下面是主类的代码:
public class KuberComm extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setResizable(false);
stage.setTitle("Login to KuberComm");
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
登录按钮的处理程序位于另一个类(由NetBeans IDE制成的控制器类)中。我无法弄清楚框架的名称是什么,以便在控制器类中使用它。
任何帮助将不胜感激!
也许这个答案很有用。看看这个。通过控制器关闭fxml窗口
在控制器类中给按钮命名:
@FXML
public Button closeButton;
并添加此方法:
@FXML
public void handleCloseButtonAction(ActionEvent event) {
Stage stage = (Stage) closeButton.getScene().getWindow();
stage.close();
}
在FXML中,您需要引用按钮名称和调用onAction的方法:
这将关闭此按钮处于打开状态的阶段。
如果使用此方法,Platform.runLater()将不再运行来自此特定控制器的任何Runnable。不要问我为什么。
与其他答案类似,但更精确。
@FXML
public void handleCloseButtonAction(ActionEvent event) {
((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}
由于某些原因,我不得不将Button强制转换为Node强制转换,但否则可以正常工作。
使用
stage.hide()
如果从控制器执行此操作,则可以从舞台场景内的任何Node中获取舞台(如有必要,请FXML加载器使用的id属性将一个分配给控制器的字段) fxml中的fxml命名空间):
Window stage = node.getScene().getWindow();
根据文档docs.oracle.com/javase/8/javafx/api/javafx/stage/…,stage.close()等同于Window.hide()。
@kervin那又怎样呢?两者都会关闭该阶段,但是如果使用最后一个代码段访问该阶段,则使用hide()不需要强制转换。这正是手术医生问的,不是吗???
感谢您的答复,但最后我找到了解决方法。我用
((Node)(event.getSource())).getScene().getWindow().hide();
中的
表示成功登录。我的意思是,在出现对话框通知用户成功登录之后,该代码就在那里了。
(为了使该行代码正常工作,我也导入了正确的内容)
隐藏不会关闭窗口,只是处于可见模式。最好的解决方案是:
@FXML
private void exitButtonOnAction(ActionEvent event){
((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}
尽管
getScene().getWindow();
在Node上的
将带您进入控制器的舞台,请务必注意,调用close()或hide()是等效的,并且只会使登录窗口不可见。至于使用dispose():
此链接可能有助于清除任何混乱。
更多相关内容 -
java实现点击按钮弹出新窗体功能
2020-08-25 19:02:32主要为大家详细介绍了java实现点击按钮弹出新窗体功能,旧窗体不进行操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java实现点击按钮事件弹出子窗口
2020-08-25 19:03:10主要为大家详细介绍了java实现点击按钮事件弹出子窗口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java单击按钮打开一个新窗口
2021-02-26 13:43:09从Java Docs获得的前一行支持的某些行如下: Although it is possible to do without a layout manager, you should use a layout manager if at all possible. A layout manager makes it easier to adjust to look...这是您可以做的事情,对于这种情况,您有多个窗体或Windows,您可以做的是使用JPanel,可以将此
CardLayout设置为LayoutManager,然后您可以将两个JPanel添加到它并使用由它提供的方法.
使用绝对定位时不要使用setBounds()这实际上不是将组件放入父容器的正确方法.而是使用setLocation(…)和setSize(…)方法.考虑不要尽可能多地使用绝对定位.从Java Docs获得的前一行支持的某些行如下:
Although it is possible to do without a layout manager, you should use a
layout manager if at all possible. A layout manager makes it easier to
adjust to look-and-feel-dependent component appearances, to different
font sizes, to a container’s changing size, and to different locales.
Layout managers also can be reused easily by other containers, as well as
other programs.
因为你的程序输出在任何意义上都不是一种舒缓的体验. Atleast LayoutManager可以使您的工作更加轻松,因为您无需为每个组件指定位置和大小.尝试走过Layout Mangers Tutorials,尽快习惯它们.他们是真正的救星:-)
以下是从您的SOURCE CODE中获取的修改代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CardLayoutExample
{
private JPanel contentPane;
private MyPanel panel1;
private MyPanel2 panel2;
private void displayGUI()
{
JFrame frame = new JFrame("Card Layout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new CardLayout());
panel1 = new MyPanel(contentPane);
panel2 = new MyPanel2();
contentPane.add(panel1, "Panel 1");
contentPane.add(panel2, "Panel 2");
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CardLayoutExample().displayGUI();
}
});
}
}
class MyPanel extends JPanel {
private JTextField How;
private JLabel jcomp2;
private JLabel jcomp3;
private JButton jcomp4;
private JPanel contentPane;
public MyPanel(JPanel panel) {
contentPane = panel;
//construct components
How = new JTextField (1);
jcomp2 = new JLabel ("How long were you parked?");
jcomp3 = new JLabel ("Minutes");
jcomp4 = new JButton ("openNewWindow");
//adjust size and set layout
setPreferredSize (new Dimension (315, 85));
setLayout (null);
//set component bounds (only needed by Absolute Positioning)
How.setBounds (245, 50, 60, 25);
jcomp2.setBounds (35, 30, 185, 50);
jcomp3.setBounds (250, 30, 60, 20);
jcomp4.setLocation(0, 0);
jcomp4.setSize(315, 25);
jcomp4.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
CardLayout cardLayout = (CardLayout) contentPane.getLayout();
cardLayout.next(contentPane);
}
});
//add components
add (How);
add (jcomp2);
add (jcomp3);
add (jcomp4);
}
}
class MyPanel2 extends JPanel {
private JButton jcomp1;
private JButton jcomp2;
private JButton jcomp3;
private JTextField jcomp4;
public MyPanel2() {
//construct components
jcomp1 = new JButton ("test1");
jcomp2 = new JButton ("test2");
jcomp3 = new JButton ("test3");
jcomp4 = new JTextField (5);
//adjust size and set layout
setPreferredSize (new Dimension (395, 156));
setLayout (null);
//set component bounds (only needed by Absolute Positioning)
jcomp1.setBounds (20, 45, 100, 25);
jcomp2.setBounds (135, 60, 100, 25);
jcomp3.setBounds (260, 35, 100, 25);
jcomp4.setBounds (105, 115, 100, 25);
//add components
add (jcomp1);
add (jcomp2);
add (jcomp3);
add (jcomp4);
}
}
-
如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。
2021-02-12 22:44:48展开全部首先分析需要32313133353236313431303231363533e4b893e5b19e31333363376530的GUI技术...窗口使用(JFrame),按钮使用(JButton)。设想一个符合题目需求的场景两个窗口关联并且跳转,最常见的场景就是登陆了。...展开全部
首先分析需要32313133353236313431303231363533e4b893e5b19e31333363376530的GUI技术
java中一般使用swing 和awt技术来实现图形界面,Swing组件较多,功能比较强大,所以这里使用Swing组件来实现。窗口使用(JFrame),按钮使用(JButton)。
设想一个符合题目需求的场景
两个窗口关联并且跳转,最常见的场景就是登陆了。
登陆窗口,输入用户名和密码,如果成功就跳转到主窗口
核心逻辑,跳转窗口的关键代码
一般可以隐藏本窗口(setVisible(false);),显示新窗口来实现窗口的跳转。
但是隐藏窗口,会在后面浪费系统资源。
如果不再使用该窗口,应该彻底销毁(dispose();),释放系统资源
代码和注释
LoginFrame 类import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//LoginFrame 登陆窗口 功能 实现用户登陆 ,如果成功就跳转
//LoginFrame 继承于窗口类, 并实现ActionListener接口
public class LoginFrame extends JFrame implements ActionListener {
// 申明需要的组件
JButton jb1, jb2;//按钮
JTextField jtf1;//文本框
JPasswordField jpf1;//密码框
public LoginFrame() {
// 窗口属性的设置
setTitle("登陆窗");// 窗口标题
setSize(300, 180);// 窗口大小
setLocationRelativeTo(null);// 窗口居中
setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭窗口则退出虚拟机
setLayout(new FlowLayout());// 设置布局流式布局
JPanel jp = new JPanel(new GridLayout(4, 1));// 设置面板为表格布局4行1列
// 第一行
JPanel jp1 = new JPanel();
JLabel jl1 = new JLabel("账号 ");
jtf1 = new JTextField(12);
jp1.add(jl1);
jp1.add(jtf1);
jp.add(jp1);
// 第二行
JPanel jp2 = new JPanel();
JLabel jl2 = new JLabel("密码 ");
jpf1 = new JPasswordField(12);
jp2.add(jl2);
jp2.add(jpf1);
jp.add(jp2);
// 第三行
JPanel jp3 = new JPanel();
jb1 = new JButton("登陆");
jb1.addActionListener(this);// 添加动作响应器
jb2 = new JButton("重置");
jb2.addActionListener(this);// 添加动作响应器
jp3.add(jb1);
jp3.add(jb2);
jp.add(jp3);
// 第四行
JPanel jp4 = new JPanel();
JLabel jl3 = new JLabel("提示: 账号 admin 密码 123");
jl3.setForeground(Color.DARK_GRAY);
jp4.add(jl3);
jp.add(jp4);
add(jp);
}
// 动作响应
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();// 根据动作命令,来进行分别处理
if (cmd.equals("登陆")) {
String id = jtf1.getText();// 取得用户名
String key = new String(jpf1.getPassword());// 取得密码
if (id.equals("admin") && key.equals("123")) {// 判断是否登录成功
// 如果登录成功
setVisible(false);// 本窗口隐藏,
new MainFrame(id).setVisible(true);// 新窗口显示
dispose();//本窗口销毁,释放内存资源
} else {
//如果登录失败 弹出提示
JOptionPane.showMessageDialog(this, "用户名或者密码错误.", "通知", JOptionPane.ERROR_MESSAGE);
clearText();//清空文本框 密码框的输入
}
} else if (cmd.equals("重置")) {
clearText();
}
}
private void clearText() {//清空文本框, 密码框的输入
jtf1.setText("");
jpf1.setText("");
}
//main方法, 程序的入口
public static void main(String[] args) {
new LoginFrame().setVisible(true);//创建登录窗口,并可见
}
}
MainFrame类import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainFrame extends JFrame {
public MainFrame(String name) {
setTitle("主窗口");//标题
setSize(300, 260);//大小
setLocationRelativeTo(null);//居中
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel jp = new JPanel();
JLabel jl1 = new JLabel("欢迎");
JLabel jl2 = new JLabel(name);
jl2.setForeground(Color.BLUE);//设置文本颜色
JLabel jl3 = new JLabel("使用系统.");
jp.add(jl1);
jp.add(jl2);
jp.add(jl3);
add(jp, BorderLayout.NORTH);
JTextArea jta = new JTextArea();
jta.setLineWrap(true);
jta.append("消息提示");
jta.append(" 消息!通知~!");
JScrollPane jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(jsp);
JPanel jp2 = new JPanel();
JButton jb = new JButton("退出");
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);//退出
}
});
jp2.add(jb);
add(jp2,BorderLayout.SOUTH);
}
}
运行效果图
-
Java建立窗口并通过按钮实现窗口跳转
2021-02-26 10:30:35为之前的游戏做了一个菜单的模型这是菜单类importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;...publicclassMenuextendsJFrameimplementsActionListener{//定义两个按钮pr...为之前的游戏做了一个菜单的模型
这是菜单类import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Menu extends JFrame implements ActionListener {
//定义两个按钮
private JButton Game_Start;
private JButton Game_Over;
public Menu(){
//定义按钮的排列方式
setLayout(new FlowLayout());
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setSize(300,200);
this.setLocation(300,400);
Game_Start = new JButton("开始游戏");
Game_Over = new JButton("结束游戏");
this.add(Game_Start);
this.add(Game_Over);
Game_Start.addActionListener(this);
Game_Over.addActionListener(this);
this.setVisible(true);
}
public static void main(String[] args) {
Menu menu = new Menu();
}
/**
* Invoked when an action occurs.
*
* @param e
*/
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == Game_Start){
this.dispose();
new Newframe();
}
if(e.getSource() == Game_Over){
this.dispose();
System.exit(0);
}
}
}
这是新的一个类(模拟我的游戏主类)import javax.swing.*;
public class Newframe extends JFrame {
public Newframe(){
this.setSize(300,200);
this.setLocation(300,400);
this.setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
演示:
当点击按钮开始游戏的时候,会跳转到下一个新的窗口,而点击结束游戏的时候会关闭窗口,并停止运行这个程序。
这个是点击开始游戏之后的新窗口 ↑ ↑ ↑
-
java实现点击按钮弹出新窗体功能|chu
2021-03-08 10:16:54本文实例为大家分享了Java实现点击按钮弹出新窗体的功能,旧窗体不进行操作分析:对于自定义窗体来说,最简单直接的做法就是让新窗体继承javax.swing.JDialog(对话框属于顶级窗口,跟JFrame同级),在创建该窗体后... -
java swing 编程中,如何实现点击按钮弹出新的窗口???
2021-02-12 13:30:40展开全部其实32313133353236313431303231363533e78988e69d8331333335313762是内部类的运用,我附上了程序源码和运行结果...importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;publicclasspopu... -
java按钮实现页面跳转 | 学步园
2021-02-12 20:03:04假如有两个frame,分别为frame1,frame2,frame1加个按钮实现跳转.frame1代码如下import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;... -
如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口?
2021-02-26 12:58:35// 打开新窗口 }}); import javax.swing.*; import java.awt.Rectangle; import java.awt.event.*; public class Swing7 extends JFrame implements ActionListener { JButton jb = new JButton(); public Swing7... -
Java点击按钮后弹出新窗口,关闭新窗口后如何返回到原来的窗口?
2015-07-21 09:54:54如题,现在设计一个界面,里面有一个按钮,增加ActionListener事件,点击按钮后弹出一个新的窗口,里面有更详细的信息。现在将新窗口关闭,想返回到原来的旧窗口。菜鸟一枚,请前辈指点迷津... -
如何通过单击按钮关闭Java窗口 – JavaFX项目
2021-03-08 03:38:01我创建了一个JavaFX项目,并为java Scene Builder中的第一个登录框架创建了GUI.登录成功后,必须关闭登录框,并且必须显示下一帧(主程序框).我可以使新框架出现,但我无法关闭登录框架.我试过像dispose()这样的东西,但... -
Java swing应用程序,单击按钮时关闭一个窗口,然后打开另一个窗口
2021-02-26 10:53:57小编典典StartupWindow.javaimport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.SwingUtilities;public class ... -
java处理按钮点击事件的方法
2021-02-12 12:55:29例如,按钮可以发送一个ActionEvent对象,而窗口可以发送WindowEvent对象。AWT时间处理机制的概要:1. 监听器对象是一个实现了特定监听器接口(listener interface)的类的实例。2. 事件源是一个能够注册监听器对象并... -
java如何创建并设置一个按钮
2021-02-12 12:19:43java如何创建并设置一个按钮AWT(抽象窗口工具包):是java提供用来建立和设置java的图形用户界面的基本工具Swing(轻量级的图形界面组件):是以AWT平台为基础构建起来的新组件与AWT相比,Swing组件在实现时不包括任何... -
通过点击按钮打开新的窗口
2020-05-26 12:21:35通过点击按钮打开新的窗口 通过点击某个按键打开新的窗口,原来的窗口关闭或者不关闭; 主要语句 //创建新的界面 A a=new A(); //将新的界面展示出来,此参数设置为true A.setVisible(true); //将旧的界面隐藏,此... -
如何在单击按钮时打开新的子窗口?(wxpython)
2020-12-03 16:59:00import wxclass MyFrame(wx.Frame):def __init__(self ):wx.Frame.__init__(self, None, -1, 'wxChoice test', size=(300, 150))colorList = ['blue','green','yellow','red']# create the dropdown boxself.choice1... -
Java swing应用程序,关闭一个窗口,并在单击按钮时打开另一个窗口
2021-02-25 19:28:29这是一个例子:StartupWindow.javaimport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.SwingUtilities;public ... -
Swing组件中,如何用一个BUTTON弹出一个新窗口?
2021-03-11 16:03:47满意答案znzrg2013.12.24采纳率:45%等级:12已帮助:7121人在JButton 的事件中 new 一个窗口然后 设置窗口为可见的例如 dialog.setVisble(true);下面是一个示例:import java.awt.event.ActionEvent;import java.... -
java GUI点击一个按钮怎么跳转到下一个窗口
2021-02-28 13:51:22importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;impor...想从登录的窗口跳转到注册的窗口,这样写点击注册为什么不跳转package view;import java.aw... -
Java点击按钮弹出窗口(两种按钮)
2014-12-11 10:50:45import java.awt.Button; import java.awt.Frame; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; -
java – 如何向按钮添加动作?
2021-03-07 23:11:54} } 使用此选项,您只有1个JFrame,但您可以通过不同的视图进行更改,并且不会在任务栏上烦扰具有多个窗口的用户. 这里还有一个提示:如果你要打开第二个JFrame来防止用户在第一个上做某事,你应该考虑使用JOptionPane... -
java用户界面-关闭当前窗口解决思路
2021-03-25 08:05:18java用户界面----关闭当前窗口我的小程序的意图是:有个界面A,界面中有若干的按钮,想要在点击其中的一个按钮的时候会出来另一个界面B,此时想要通过B中的按钮或者界面中的X号将B关闭掉现在遇到如题所示的问题在... -
Java jframe中如何实现窗口的关闭
2021-02-27 18:02:23展开全部效果图参考代码和注释如下32313133353236313431303231363533e59b9ee7ad9431333365633836importjava.awt.event.*;importjavax.swing.*;publicclassDemoFrameextendsJFrame{JButtonjbExit;publicDemoFrame(){... -
Java 点击按钮下载Excel
2022-03-22 14:35:15Java 点击按钮下载Excel