我如何使用Java中的按钮在现有Jframe上打开Jframe

时间:2014-04-30 19:41:29

标签: java swing jframe cardlayout

我有2个框架,第一个框架只有一个框架和一个按钮,这将导致另一个框架具有所有组件,例如具有更多组件的标签。

我使用的代码是:

 button_1.addActionListener(new ActionListener()
     {

      public void actionPerformed(ActionEvent e) {

         JFrame  Frame_2 = new JFrame();

         Frame_1.setVisible(false);
         Frame_2.setVisible(true);
    }
 });  

这是创建一个新的单独框架,但我想在现有JFrame上创建新的JFrame

更新

@VinceEmigh +1

感谢您提供详细的自定义解决方案。它表明有人真的愿意帮助,我是一个自学者,仅在3个月前开始,所以你的代码有点难以理解,但使用cardlayout的想法完成了工作,我想出了一个解决方案。

JFrame guiFrame = new JFrame();
CardLayout cards;
JPanel cardPane;

    JButton B_1 = new JButton("Next Card");
    B_1.setActionCommand("Next Card");
    B_1.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent event)
        {
            cards.next(cardPane);
        }
    });

cards = new CardLayout();
cardPane = new JPanel();
cardPane.setLayout(cards);
cards.show(cardPane, "Main");

JPanel Card_1 = new JPanel();
JLabel background_1 = new JLabel(new ImageIcon("C:\\Users\\ME\\Desktop\\Back1.jpg"));
Card_1.add(background_1);
Card_1.add(B_1);

JPanel Card_2 = new JPanel();
JLabel background_2 = new JLabel(new ImageIcon("C:\\Users\\ME\\Desktop\\Back2.jpg"));
Card_2.add(background_2);

cardPane.add(Card_1, "Main");
cardPane.add(Card_2, "Sub");

1 个答案:

答案 0 :(得分:1)

你不应该使用2帧。您应该使用1帧,然后使用CardLayout在帧中的面板之间切换。除非您指的是在框架内嵌套框架,否则为1个应用程序创建2个不同的框架通常是不好的做法,如果可能应该避免使用。

将框架布局设置为CardLayout,在框架中添加2个面板。一个面板包含按钮,另一个面板包含组件。

当您的按钮事件触发动作侦测器时,请使用您为帧布局添加的卡布局切换面板。

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class App extends JFrame {
    private CardLayout cl = new CardLayout();
    private JPanel firstPanel = new FirstPanel();
    private JPanel secondPanel = new SecondPanel();

    public App() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setLayout(cl);

        add(firstPanel, "first");
        add(secondPanel, "second");

        setLocationRelativeTo(null);
        setVisible(true);
    }

    public void switchPanel(String name) {
        cl.show(getContentPane(), name);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                App app = new App();
            }
        });
    }

    class FirstPanel extends JPanel implements ActionListener {
        private JButton button = new JButton("Button");

        public FirstPanel() {
            button.addActionListener(this);
            add(button);
        }

        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == button) {
                switchPanel("second");
            }
        }
    }

    class SecondPanel extends JPanel { }
}