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

时间:2014-03-16 21:00:58

标签: java swing jframe

我有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) {
        }
    }

}

}

3 个答案:

答案 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);
    }
}