我有2个包,每个包都包含一个扩展JFrame的单独MyFrame类。我有第三个包含MyFrame Class的包扩展JFrame。
我想在我的" main"中显示其他包中的JFrame。按下相应按钮时打包JFrame。
我该怎么做?
这就是我现在所拥有的: 公共类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) {
}
}
}
}
答案 0 :(得分:2)
如果您只是尝试显示另一个窗口,而不是将其添加到当前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的课程。这使得代码非常不灵活,正如您所发现的那样。最好将代码设置为制作JPanels,因为这些 可以 放在其他JFrame,其他JPanels,JApplets,JDialogs中,与CardLayouts交换等等......
修改强>
可能适合您的kludge是获取另一个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
}
}
答案 1 :(得分:0)
你可以尝试这样的事情。确保导入第二帧的包并且该类是公共的。
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);
}
}
答案 2 :(得分:0)
首先,您必须导入其他帧的包
import main.myframespackage.*;
这对于使这个类对您的实际类“可见”是必要的。您应该查看javas包概念,例如在这里:http://docs.oracle.com/javase/tutorial/java/package/usepkgs.html。也许研究java方法和类的可见性概念是有用的,例如http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
允许您的某个框架的名称为TestFrame2
。然后你可以像这样显示它:
public void actionPerformed(ActionEvent e) {
Object eventSource = e.getSource();
if (eventSource == klantenbinding) {
TestFrame2 tframe2 = new TestFrame2();
tframe2.setVisible(true);
}
}