У меня есть 2 пакета, и каждый из них содержит отдельный класс MyFrame, который расширяет JFrame. У меня есть третий пакет с классом MyFrame, который расширяет JFrame.
Я хочу отобразить JFrames из других пакетов в моем "основном" пакете JFrame, когда я нажимаю соответствующую кнопку.
Как мне это сделать?
это то, что я имею прямо сейчас: public class 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) {
}
}
}
}
Что делать, если вы просто попытаетесь отобразить другое окно, а не добавить его в свой текущий графический интерфейс?
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, поскольку они могут быть размещены в других JFrames, в других JPanels, JApplets, в JDialogs, заменены с помощью CardLayouts и т.д....
редактировать
Ключ, который может сработать для вас, состоит в том, чтобы получить contentPane другого JFrame и вставить его:
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, например здесь: http://docs.oracle.com/javase/tutorial/java/package/usepkgs.html. Возможно, полезно изучить также концепции видимости java-методов и классов, например http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html.
Позволяет TestFrame2
имя одному из ваших кадров TestFrame2
. Затем вы можете отобразить его так:
public void actionPerformed(ActionEvent e) {
Object eventSource = e.getSource();
if (eventSource == klantenbinding) {
TestFrame2 tframe2 = new TestFrame2();
tframe2.setVisible(true);
}
}
Вы могли бы попробовать что-то вроде этого. Убедитесь, что пакет второго кадра импортирован и класс является общедоступным.
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);
}
}