/ / Kommunikation zwischen JFrame und JPanel - Java, Swing, JFrame, Jpanel

Kommunikation zwischen JFrame und JPanel - Java, Swing, JFrame, Jpanel

Ich habe JFrame mit JFrame Form in NetBeans erstellt. In diesem JFrame habe ich JPanel mit zweitem JPanel verschachtelt. Dann habe ich eine separate JPanel-Klasse (ich habe JPanel erweitert).

Ich möchte dieses separate JPanel als das verschachtelte im JFrame verwenden. Wenn ich auf einen JButton klicke, möchte ich den JFrame benachrichtigen, dass auf die Schaltfläche geklickt wurde.

Bisher habe ich es geschafft, das separate JPanel mit dem folgenden Befehl an den JFrame zu senden initComponents() des JFrame:

nestedPanel = new separateJPanel

Aber jetzt habe ich keine Ahnung, wie ich Informationen senden soll, dass auf die Schaltfläche geklickt wurde.

Irgendwelche Tipps, wie ich das erreichen kann?

Antworten:

3 für die Antwort № 1

Eine einfache Möglichkeit besteht darin, Ihrer JPanel-Klasse eine Delegierungsmethode zuzuweisen, mit der andere Klassen der betreffenden Schaltfläche ActionListener hinzufügen können. Zum Beispiel:

public void addButton1ActionListener(ActionListener listener) {
button1.addActionListener(listener);
}

Auf diese Weise kann der JFrame, wenn er eine Instanz des JPanel enthält, diese Methode aufrufen, um einen Listener an den JButton zu übergeben. Zum Beispiel:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo {
private static void createAndShowGui() {
Frame1 frame = new Frame1();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

// I almost never extend JFrame
class Frame1 extends JFrame {
private Panel1 panel1 = new Panel1();
private JLabel label = new JLabel(" ", SwingConstants.CENTER);

public Frame1() {
super("Foo");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
add(panel1, BorderLayout.CENTER);
add(label, BorderLayout.SOUTH);
pack();
setLocationByPlatform(true);

panel1.addButton1ActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
label.setText("Button pressed");
}
});
}
}

class Panel1 extends JPanel {
private JButton button1 = new JButton("Button");

public Panel1() {
add(button1);
}

public void addButton1ActionListener(ActionListener listener) {
button1.addActionListener(listener);
}
}

Beachten Sie, dass diese Lösung für einfaches Spielzeug in Ordnung istWenn Sie jedoch die Idee haben, eine echte Großanwendung zu erstellen, wird diese nicht gut skaliert, da die Kopplung des Codes erhöht und die Kohäsion verringert wird. In dieser Situation wäre es viel besser, ein Programm zu erstellen, das eine größere Anzahl von Anwendungen verwendet Model-View-Control oder MCV-Architektur.


4 für die Antwort № 2

Sie können dem Frame ein Panel-Attribut und dem Panel ein Frame-Attribut zuweisen, um sie im Speicher zusammenzufügen. Auf diese Weise können Sie auf einfache Weise Daten über Instanzfelder aneinander übergeben.

public MyPanel extends JPanel {

MyFrame frame;

MyPanel(MyFrame frame) {
this.panel = panel;
}
}