Java 在摆动中从一个框架移动到另一个框架

Java 在摆动中从一个框架移动到另一个框架,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,不幸的是,我们的团队领导已经决定将Swing用于这个轻型桌面应用程序。我以前没有使用Swing的经验。我将在项目的GUI端工作。我已经创建了一个包含元素的框架,并在事件侦听器中编写了逻辑。现在我想在用户登录后将其重定向到一个新的帧 我该怎么做?谢谢 另外,如果你能给我指出一个适合初学者的好教程,我将不胜感激。你可以用与你已有的方法大致相同的方式创建一个新框架 MyFrame f = new MyFrame(); //MyFrame extends javax.swing.JFrame 然后把它

不幸的是,我们的团队领导已经决定将Swing用于这个轻型桌面应用程序。我以前没有使用Swing的经验。我将在项目的GUI端工作。我已经创建了一个包含元素的框架,并在事件侦听器中编写了逻辑。现在我想在用户登录后将其重定向到一个新的帧

我该怎么做?谢谢


另外,如果你能给我指出一个适合初学者的好教程,我将不胜感激。

你可以用与你已有的方法大致相同的方式创建一个新框架

MyFrame f = new MyFrame(); //MyFrame extends javax.swing.JFrame
然后把它带到前面

f.setVisible(true);
f.toFront();

在Swing中,您有一个
JFrame
。您可以使用
JDialog
s从用户处获取用户id和密码输入


这里是指向的链接。

您的框架应该保持不变,只需创建并显示新的JPanel而不是旧的JPanel

参见以下JPanel喷漆流程:


< /P> < P > @ Gilbert Le Blanc指出(+ 1)。它在摇摆

要实现您的目标:

  • 用于允许动态切换组件

  • 或者使用
    JFrame#removeAll()
    并添加新的
    JPanel
    (+1个Fess)

  • 尝试使用
    JDialog
    /
    JOptionPane
    ,然后重定向到main
    JFrame
    以下是一个关于该主题的好链接:


听起来你的术语有些混乱。当我们听到“Frame”时,我们认为它相当于“Window”。因此,大多数情况下,我们建议不要使用多个窗口,而是更改窗口的内容。内容通常使用“JPanel”制作

因此,一般来说,您可以设置
JFrame
,您可以使用以下内容设置内容:

JPanel loginPanel = new JPanel();
frame.setContentPane(loginPanel);
如果要用新面板替换登录面板,只需将新面板传递给该函数:

JPanel mainMenuPanel = new JPanel();
frame.setContentPane(mainMenuPanel);
(当然,您希望这些面板中包含一些内容)

下面是一个简单的例子:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PanelRetriever{

    Box panel1;
    JPanel panel2;

    public PanelRetriever(final JFrame frame){
        //Build the first login panel
        panel1 = Box.createVerticalBox();
        panel1.setBackground(Color.orange);
        panel1.setOpaque(true);
        panel1.add(Box.createVerticalGlue());
        panel1.add(new JTextField(10));
        JButton login = new JButton("Login");
        login.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                frame.setContentPane(getPanel2());
                frame.validate();
            }});
        panel1.add(login);
        panel1.add(Box.createVerticalGlue());

        //Build second panel
        panel2 = new JPanel();
        panel2.setBackground(Color.blue);
        panel2.setOpaque(true);
        JButton logout = new JButton("Logout");
        logout.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setContentPane(getPanel1());
                frame.validate();
            }});
        panel2.add(logout, BorderLayout.CENTER);
    }

    public Container getPanel1(){
        return panel1;
    }

    public Container getPanel2(){
        return panel2;
    }

    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                PanelRetriever pr = new PanelRetriever(frame);
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(pr.getPanel1());
                frame.setPreferredSize(new Dimension(500, 400));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

但是我不想在代码中动态创建框架。我将通过设计器创建它。一个新的
JFrame
将创建一个新的框架,即桌面上的一个新“窗口”,保留原来的窗口。如果您只是想更改内容,那么就换掉一个新的
JPanel
。使用多个JFrames是不好的做法:坏(坏,坏)做法。用户不友好:当用户希望只看到一个图标时,会在任务栏中看到多个图标。加上编码问题的副作用。。编码和维护的噩梦:模式对话框提供了将注意力集中在该对话框内容上的简单机会-选择/修复/取消该对话框,然后继续。多个帧不存在。单击父对象时,将出现一个带有父对象的对话框(或浮动工具栏)——如果这是所需的行为,则必须在框架中实现。可能是错误的做法。糟糕的用户体验?这要视情况而定,可能是您希望给人的印象是,无需执行IPC即可启动新应用程序。不管怎样,问题是如何从一个帧切换到一个新帧,这是我的答案以最简单的形式提供的。@Fess-Gee听起来很熟悉。。)看看swing标签Wiki中引用的教程,你能给我一个完整的简单例子来说明你在回答中所说的吗?我明白你上面的观点,但无法成功实现,因为我是swing的初学者。而且我不想在gui应用程序中使用多个jframe。@Mihir我添加了一个例子,以便你可以看到代码的运行情况。