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

zy1mlcev  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(335)

我有一个问题,我必须使用两个 JFrame s、 所以我们可以忘记好的/坏的做法。
当我们过了这一关。
我的两个 JFrame s是
LoginFrame MainFrame 我想退出 MainFrameLoginFrame 反之亦然。这样做,我希望两个框架都能重新打开。就像我们如何示例化它们,即。

大型机.class

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

同样地,

loginframe.class类

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

现在,这是工作得很好,但问题是,我有一个 keyDispatchEventMainFrame 在注销后执行多次登录(不关闭应用程序)。
我相信即使在处理之后 JFrame 它实际上没有被处理。因此,当我键入任何快捷键时,先前处理的帧对象和 MainFrame 都在分发他们的活动。我怎样才能丢失(我的意思是真正地处置)所有以前的对象,以便只为当前对象触发此事件?

大型机.class

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 在这种情况下。

lg40wkob

lg40wkob1#

我希望下面的代码符合你的要求。既然你没有发布一个最小的,可复制的例子,我只能从你的[糟糕的]问题描述和你对[你的]道路或高速公路的坚持中猜出你想要什么。
问题是我有一个 keyDispatchEventMainFrame 在注销后执行多次登录
我猜你一直在添加相同的 KeyEventDispatcherKeyboardFocusManager 每一个被添加的都会执行。所以如果你加上同样的 KeyEventDispatcher 三次,它将执行三次。我假设您只想添加一次,因此需要在不再需要时删除它。
我还假设在启动应用程序时 LoginFrame 首先显示。因此我添加了一个 main 方法到类 LoginFrame ,下方。
班级 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 旗帜。

相关问题