Открытие JFrame из другого пакета в главном окне

1

У меня есть 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) {
        }
    }

}

}

Теги:
swing
jframe

3 ответа

2
Лучший ответ

Что делать, если вы просто попытаетесь отобразить другое окно, а не добавить его в свой текущий графический интерфейс?

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
    }
}
  • 0
    это работает, но я хочу добавить его в мой текущий графический интерфейс. ты прав насчет новичка. это для школьного проекта. Спасибо за чаевые
  • 0
    @LiamdeHaas: см. Редактировать, чтобы ответить.
Показать ещё 7 комментариев
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 имя одному из ваших кадров TestFrame2. Затем вы можете отобразить его так:

public void actionPerformed(ActionEvent e) {
    Object eventSource = e.getSource();
    if (eventSource == klantenbinding) {
        TestFrame2 tframe2 = new TestFrame2();
        tframe2.setVisible(true);
    }
}
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);
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню