在Swing中从一个帧移动到一个帧

时间:2012-10-17 12:45:33

标签: java swing user-interface jframe

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

我该怎么做?感谢

P.S。如果你能指点我为初学者提供一个很好的教程,我将不胜感激

5 个答案:

答案 0 :(得分:4)

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

见下面的JPanel绘画流程:

enter image description here

答案 1 :(得分:4)

正如@Gilbert Le Blanc指出的那样(+1给他)。在Swing中,它是bad practice to use multiple JFrames

完成你想要的任务:

  • 使用允许动态切换组件的CardLayout

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

  • 尝试使用JDialog / JOptionPane,然后重定向到主JFrame 这是关于该主题的良好链接:How to Make Dialogs

答案 2 :(得分:4)

听起来你的术语已经混淆了。当我们听到“框架”时,我们认为JFrame相当于“窗口”。所以大多数时候我们建议不要使用多个窗口,而是改变窗口的内容。内容通常用“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);
            }
        });
    }
}

答案 3 :(得分:3)

在Swing中,您有一个JFrame。您可以使用JDialog来获取用户的用户ID和密码输入。

以下是Oracle Swing Tutorial的链接。

答案 4 :(得分:1)

你可以用与现有基本相同的方式创建一个新框架;

MyFrame f = new MyFrame(); //MyFrame extends javax.swing.JFrame

然后将它带到前面;

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