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