Java 在主窗口中从另一个包打开JFrame

Java 在主窗口中从另一个包打开JFrame,java,swing,jframe,Java,Swing,Jframe,我有两个包,每个包都包含一个单独的MyFrame类,它扩展了JFrame。我有第三个包,其中包含MyFrame类ThetExtendJFrame 当我按下相应的按钮时,我想在我的“main”包JFrame中显示来自其他包的JFrames 我该怎么做 这就是我现在拥有的: 公共类MyFrame扩展JFrame实现ActionListener{ private JButton voorraadbeheer, klantenbinding, werkplaats, facturatie,

我有两个包,每个包都包含一个单独的MyFrame类,它扩展了JFrame。我有第三个包,其中包含MyFrame类ThetExtendJFrame

当我按下相应的按钮时,我想在我的“main”包JFrame中显示来自其他包的JFrames

我该怎么做

这就是我现在拥有的: 公共类MyFrame扩展JFrame实现ActionListener{

private JButton voorraadbeheer, klantenbinding, werkplaats, facturatie,
        parkeergarage;
private JPanel mainMenu;
private JDPanel mainWindow;

public MyFrame() {
    Dimension button = new Dimension(100, 100);

    setLayout(new BorderLayout());

    voorraadbeheer = new JButton("Voorraadbeheer");
    klantenbinding = new JButton("klantenbinding");
    werkplaats = new JButton("Werkplaats");
    facturatie = new JButton("Facturatie");
    parkeergarage = new JButton("Parkeergarage");

    voorraadbeheer.setPreferredSize(button);
    klantenbinding.setPreferredSize(button);
    werkplaats.setPreferredSize(button);
    facturatie.setPreferredSize(button);
    parkeergarage.setPreferredSize(button);

    voorraadbeheer.addActionListener(this);
    klantenbinding.addActionListener(this);
    werkplaats.addActionListener(this);
    facturatie.addActionListener(this);
    parkeergarage.addActionListener(this);

    mainMenu = new JPanel();
    mainMenu.setPreferredSize(new Dimension(120, 600));
    mainMenu.setLayout(new FlowLayout());

    mainMenu.add(voorraadbeheer);
    mainMenu.add(klantenbinding);
    mainMenu.add(werkplaats);
    mainMenu.add(facturatie);
    mainMenu.add(parkeergarage);

    add(mainMenu, BorderLayout.EAST);

    mainWindow = new JPanel();
    mainWindow.setVisible(true);
    add(mainWindow);

    setSize(1024, 600);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e) {
    Object eventSource = e.getSource();

    if (eventSource == klantenbinding) {
        try {
            klantenbinding.MyFrame klantenbindingFrame = new klantenbinding.MyFrame();
            mainWindow.add(klantenbindingFrame);
        } catch (ParseException exc) {
        }
    }

}

}你可以试试这样的东西。确保导入了第二个框架的包,并且该类是公共的

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import test2.Frame1;

public class DemoFrame {

private JFrame frame;
private JButton btn;

public DemoFrame() {
    frame = new JFrame("Demo Frame");
    frame.setSize(300, 300);
    btn = new JButton("Click for second frame");
    btn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            //create second frame
            Frame1 frame1 = new Frame1();
        }

    });
    frame.add(btn);
    frame.setVisible(true);
}

public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new DemoFrame();
        }
    });
}

}
第二帧:

public class Frame1 extends JFrame{

public Frame1() {
    this.setTitle("Frame1");
    this.setSize(300,300);
    this.setVisible(true);
}

}

如果您只是尝试显示另一个窗口,而不将其添加到当前GUI中,该怎么办

if (eventSource == klantenbinding) {
    try {
        klantenbinding.MyFrame klantenbindingFrame = new klantenbinding.MyFrame();
        // mainWindow.add(klantenbindingFrame);
        klantenbindingFrame.setVisible(true);
    } catch (ParseException e) {
      e.printStackTrace();  // never ignore exceptions
    }
}
说到这里,我认为您犯了一个初学者常见的Swing错误,即创建面向JFrame的类。正如您所发现的,这使得代码非常不灵活。最好让您的代码面向JPanel,因为这些可以放置在其他JFrame、其他JPanel、JApplets、JDialogs中,与CardLayouts交换,等等


编辑
可能对您有用的一个难题是获取另一个JFrame的contentPane并插入:

if (eventSource == klantenbinding) {
    try {
        klantenbinding.MyFrame klantenbindingFrame = new klantenbinding.MyFrame();
        Component contentPane = klantenbindingFrame.getContentPane();
        mainWindow.add(contentPane);
        mainWindow.revalidate();
        mainWindow.repaint();
    } catch (ParseException e) {
      e.printStackTrace();  // never ignore exceptions
    }
}

首先,您必须导入其他帧的包

import main.myframespackage.*;
这对于使该类对实际类“可见”是必要的。您应该查看javas包的概念,例如这里:。也许学习java方法和类的可见性概念也很有用,例如

允许其中一个帧的名称为
TestFrame2
。然后您可以这样显示它:

public void actionPerformed(ActionEvent e) {
    Object eventSource = e.getSource();
    if (eventSource == klantenbinding) {
        TestFrame2 tframe2 = new TestFrame2();
        tframe2.setVisible(true);
    }
}

我支持@wumpz的问题,并补充说:当你尝试这样做时会发生什么?您是否看到任何错误消息?代码没有编译吗?这些包在同一个项目中吗?关于您的问题,您能告诉我们的信息越多,我们就越能更好地理解它并帮助您。@wumpz I'v试图将它添加到JPanel中,但不起作用,然后我在谷歌上搜索,但我找不到任何有意义的东西显示一些真正的源代码。
“那不起作用”
告诉我们可以用来帮助您的东西很少。它怎么不起作用?你有编译器错误吗?程序运行期间出现异常?这个
“然后我在谷歌上搜索了一下,但我找不到任何有意义的东西”
帮助更少。来吧,请在这里给我们一些帮助。这是可行的,但我想把它添加到我当前的GUI中。你对初学者的看法是对的。这是一个学校项目。谢谢你的邀请tip@LiamdeHaas:顺便说一句,您最初的问题似乎与不同包中的类无关。请从一开始就向我们提供所有必要的有用信息,包括相关代码、代码尝试以及任何和所有错误消息,以使您的问题更加完整。避免对错误做出假设,直到你确定错误所在。这将有助于避免双方的挫败感,并会让你得到更好更快的答案。我使用了你的建议,它会显示内容,但它仍然会打开frame@LiamdeHaas:这是您的
klantenbinding.MyFrame
类的错误。它的构造函数可能有打开新JFrame的代码。您必须修复代码。同样,让类创建jpanel而不是JFrames要好得多。相信我,这将大大提高GUI的灵活性。如果我从KlanteneBinding.MyFrame类中删除这一部分,它能工作吗?
setSize(900600);setVisible(真);可设置大小(假);setDefaultCloseOperation(关闭时退出)