有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在不退出应用程序的情况下处理JFrame并将其重新创建为新的?

我有一个问题,我必须使用两个JFrame,这样我们就可以忘记好的/坏的做法

现在,当我们越过这一点

我的两个

  1. LoginFrame
  2. MainFrame

我想从MainFrame注销到LoginFrame,反之亦然。这样做,我希望两个框架都能重新打开。 就像我们实例化它们一样

主机。阶级

//on signout button event
new LoginFrame().setVisible(true);
dispose(); //it will dispose this frame and destroy its UI components and free resources etc etc.

同样地

登录框架。阶级

//on signin button event
new MainFrame().setVisible(true);
dispose(); //it will dispose this frame and destroy its UI components and free resources etc etc.

现在,这很好,但问题是我在MainFrame中有一个keyDispatchEvent,它在我注销后执行了多次登录(而没有关闭应用程序)

我相信即使在处理之后,JFrame它实际上也没有被处理。因此,当我键入任何快捷键时,以前处理的帧对象和MainFrame的新对象都在调度它们的事件。我如何才能丢失(我的意思是真正地处置)所有以前的对象,从而只为当前对象触发此事件

主机。阶级

final static KeyboardFocusManager keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();

keyManager.addKeyEventDispatcher(new KeyEventDispatcher() 
{

        @Override
        public boolean dispatchKeyEvent(KeyEvent e) 
        {
           // if key is alt+r  
           {
               signout(); // getting called repeatedly on single key release 
           }
        }
});

我不想使用相同的对象,因为它们将有以前的状态/信息/更改。只是想扔掉废弃的东西

此外,在这种情况下,我必须使用KeyboardManagerDispatchKeyEvent


共 (1) 个答案

  1. # 1 楼答案

    我希望下面的代码符合您的要求。既然你没有发布minimal, reproducible example,我只能从你(糟糕的)问题描述和你对[your] way or the highway的坚持中猜出你想要什么

    the problem is that I have a keyDispatchEvent in MainFrame which is executing a number of times I login after signout

    我的猜测是,您不断地将相同的KeyEventDispatcher添加到KeyboardFocusManager中,并且每个被添加的都将执行。因此,如果将相同的KeyEventDispatcher添加三次,它将执行三次。我假设您只想添加一次,因此在不再需要时需要删除它

    我还假设,在启动应用程序时,您希望首先显示LoginFrame。因此,我在下面的LoginFrame类中添加了一个main方法

    LoginFrame

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.KeyboardFocusManager;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class LoginFrame extends JFrame implements ActionListener {
    
        public LoginFrame() {
            KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(MainFrame.ked);
            setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
            JButton signin = new JButton("sign in");
            signin.addActionListener(this);
            JPanel panel = new JPanel();
            panel.add(signin);
            add(panel, BorderLayout.PAGE_END);
            pack();
            setLocationByPlatform(true);
        }
    
        @Override
        public void actionPerformed(ActionEvent event) {
            new MainFrame().setVisible(true);
            dispose();
        }
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> new LoginFrame().setVisible(true));
        }
    }
    

    MainFrame

    import java.awt.BorderLayout;
    import java.awt.KeyEventDispatcher;
    import java.awt.KeyboardFocusManager;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class MainFrame extends JFrame implements ActionListener {
        final static KeyboardFocusManager keyManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    
        private static boolean  done;
        static KeyEventDispatcher ked;
    
        public MainFrame() {
            keyManager.removeKeyEventDispatcher(ked);
            ked = new KeyEventDispatcher() {
                
                @Override
                public boolean dispatchKeyEvent(KeyEvent ke) {
                    int key = ke.getKeyCode();
                    int modifiers = ke.getModifiersEx();
                    if (key == KeyEvent.VK_R  &&  (modifiers & KeyEvent.ALT_DOWN_MASK) == KeyEvent.ALT_DOWN_MASK) {
                        if (done) {
                            done = false;
                        }
                        else {
                            done = true;
                            actionPerformed(null);
                        }
                    }
                    return false;
                }
            };
            keyManager.addKeyEventDispatcher(ked);
    
            setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
            JButton signout = new JButton("sign out");
            signout.addActionListener(this);
            JPanel panel = new JPanel();
            panel.add(signout);
            add(panel, BorderLayout.PAGE_END);
            pack();
            setLocationByPlatform(true);
        }
    
        @Override
        public void actionPerformed(ActionEvent event) {
            new LoginFrame().setVisible(true);
            dispose();
        }
    }
    

    注:

    • 我不知道为什么,但每次我在键盘上按Alt+R时,事件调度器都会触发两次。因此有了done标志