private Panel anderer Klasse verändern

coree

Mitglied
Hallo,
ich stehe gerade vor dem folgenden Problem.
Ich bin gerade dabei aus meiner Gui-Klasse einzelne Elemente in eigenen Klassen auszulagen.
Nun probiere ich dies zunächst mit Test-Klassen. Jetzt habe ich dabei das Problem, dass ich aus der einen Klasse zum Beispiel die Hintergrundfarbe eines anderen Panels, welches in einer anderen Klasse ist, verändern möchte.

1. Hauptklasse
Java:
public class MenuLayoutDemo extends JFrame {

    protected final JPanel programPanel; // UM DIESES PANEL GEHT ES
    
    public static void main(final String[] args) {
        new MenuLayoutDemo();
    }
    MenuLayoutDemo() {
    super("MusicBuddies v.1");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final GraphicsEnvironment env = GraphicsEnvironment
            .getLocalGraphicsEnvironment();
    final Rectangle maxBounds = env.getMaximumWindowBounds();

    final Container content = getContentPane();
    content.setPreferredSize(new Dimension(maxBounds.width,
            maxBounds.height));
    content.setBackground(new Color(34, 34, 34));

    final GroupLayout guiLayout = new GroupLayout(content);
    content.setLayout(guiLayout);

    final MenuPanel menuPanel = new MenuPanel(this);
    programPanel = new JPanel();
    programPanel.setBackground(Color.red);

    guiLayout.setHorizontalGroup(guiLayout.createSequentialGroup()
      .addGroup(guiLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
         .addGroup(guiLayout.createSequentialGroup()
              .addComponent(menuPanel, GroupLayout.PREFERRED_SIZE,
                 GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
              .addComponent(programPanel)))
    );
    guiLayout.setVerticalGroup(guiLayout.createSequentialGroup()
        .addGroup(guiLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
           .addComponent(menuPanel)
           .addComponent(programPanel))
    );

    pack();
    setVisible(true);
    }
}

2. Panelklasse
Java:
public class MenuPanel extends JPanel {

    private final MenuLayoutDemo ml;
    private JButton sammlungButton;

    public MenuPanel(final MenuLayoutDemo ml) {
        super(new GridBagLayout());
        this.ml = ml;
        this.setBackground(new Color(34, 34, 34));

        final GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        final Rectangle maxBounds = env.getMaximumWindowBounds();

        final GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;

        sammlungButton = new JButton(new ImageIcon(getClass().getResource("images/mb_button_musiksammlung_active.jpg")));
        sammlungButton.setFocusPainted(false);
        sammlungButton.setPreferredSize(new Dimension(200, 30));
        sammlungButton.setRolloverEnabled(false);
        sammlungButton.setBorder(null);
        sammlungButton.setContentAreaFilled(false);
        c.gridx = 0;
        c.gridy = 0;
        c.insets = new Insets(0, 20, 0, -78);
        sammlungButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                System.out.println("Sammlung");
                ml.programPanel.setBackground(Color.black); // HIER BENÖTIGE ICH DAS PANEL
            }
        });
        this.add(sammlungButton, c);

    }
}

Indem ich das programPanel derzeit protected statt private setze umgehe ich sozusagen das Problem. Wie bekomme ich es zum laufen, dass die Variable weiterhin private bleiben kann und trotzdem alles funktioniert?
Mit getter/setter komme ich auch nicht weit.

Hoffe es kann mir jemand weiterhelfen. danke schonmal.
 

coree

Mitglied

eher weil ich zu blöd dafür war ;) aber nu klappts, danke.


nun hab ich aber noch eine weitere frage, bei der es um etwas ähnliches geht.
Ich habe nen ButtonListener, durch welchen ein Panel sich auf Knopfdruck ändern soll:
ButtonListener
Java:
class ButtonListener implements ActionListener {
    final SammlungPanel sammlungP2; // ich denk, hier muss sammlungP2 einfach nur noch das richtige zugewiesen werden, damit es klappt

    /**
     * ...
     * @param actionEvent ...
     */
    @Override
    public void actionPerformed(final ActionEvent actionEvent) {
                sammlungP2.getSammlungPanel2().removeAll();
                sammlungP2.getSammlungPanel2().add(jTree);
                sammlungP2.getSammlungPanel2().revalidate();
                sammlungP2.getSammlungPanel2().repaint();

    }
    
}
SammlungPanel mit sammlungPanel2
Java:
public class SammlungPanel extends JPanel {

    private final transient JPanel sammlungPanel2;

    public final JPanel getSammlungPanel2() {
        return sammlungPanel2;
    }

    public SammlungPanel(final MenuLayoutDemo mLayout)
            throws ClassNotFoundException, SQLException {
...
    }
}

nur kann ich hier nicht wie bei meiner ersten frage die referenz übergeben, da ich ja eine methode vom actionlistener verwende.
wie schaff ichs hier, auf die getSammlungPanel2()-Methode zugreifen zu können?
stehe im moment irgendwie auf dem schlauch... :/
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
[c]ButtonListener[/c] ist doch eine ganz normale Klasse..auch der kannst du einen Konstruktor einbauen der eine Referenz von einem [c]SammlungPanel[/c]-Objekt übergeben bekommt ?!
 

coree

Mitglied
[c]ButtonListener[/c] ist doch eine ganz normale Klasse..auch der kannst du einen Konstruktor einbauen der eine Referenz von einem [c]SammlungPanel[/c]-Objekt übergeben bekommt ?!

das hatte ich soweit auch schon:
Java:
class ButtonListener implements ActionListener {

    final SammlungPanel sammlungP2;

    public ButtonListener(SammlungPanel sammlungP2) {
        this.sammlungP2 = sammlungP2;
    }

nur hab ichs nun nicht mehr hinbekommen, in einer anderen klasse mit
Java:
folderButton.addActionListener(new ButtonListener());
das ganze aufzurufen. muss ich dort auf wieder die sammlungpanel referenz übergeben um new ButtonListener(SammlungPanel sammlungP2); nutzen zu können? oder geht das auch auf ne andere art und weise? denn damit seh ich dann im weiteren verlauf neue probleme auf mich zu kommen.
 

eRaaaa

Top Contributor
nur hab ichs nun nicht mehr hinbekommen, in einer anderen klasse mit
Java:
folderButton.addActionListener(new ButtonListener());
das ganze aufzurufen. muss ich dort auf wieder die sammlungpanel referenz übergeben um new ButtonListener(SammlungPanel sammlungP2); nutzen zu können?
ja klar, du musst dann natürlich sammlungP2 übergeben ja...
oder geht das auch auf ne andere art und weise? denn damit seh ich dann im weiteren verlauf neue probleme auf mich zu kommen.

vllt stimmt ja dein "Design" dann nicht so ganz :)
Klar, es geht immer auch irgendwie anders, z.B. könntest du einfach alles public static oder so machen, aber ob das dann schöner ist, ist wieder eine ganz andere Sache :)
 

coree

Mitglied
Naja das Problem kam nun doch... :/
ich post einfach ma die design struktur und die "wichtigen" stellen.
MenuLayoutDemo
Java:
public class MenuLayoutDemo extends JFrame {
    private static SammlungPanel sammlungP;
    public static void main(final String[] args)
            throws ClassNotFoundException, SQLException {
        new MenuLayoutDemo(sammlungP);
    }
    
    MenuLayoutDemo(SammlungPanel sammlungP)
            throws ClassNotFoundException, SQLException {
...
    this.sammlungP = sammlungP;
    final MenuBar menu = new MenuBar(sammlungP);
    setJMenuBar(menu.createMenuBar());
    final SammlungPanel sammlungPanel = new SammlungPanel(this);
...
   }
}
MenuBar
Java:
public class MenuBar {

    final SammlungPanel sammlungP;

    public MenuBar(SammlungPanel sammlungP) {
        this.sammlungP = sammlungP;
    }

   /**
    * Erstellt eine Menüleiste.
    * @return menuBar
    */
   public final JMenuBar createMenuBar() {
...
        menuItem.addActionListener(new Options(sammlungP));
...
    }
}
Options
Java:
class Options implements ActionListener {

    public static JTextPane folderText;

    final SammlungPanel sammlungP2;

    public Options(SammlungPanel sammlungP) {
        this.sammlungP = sammlungP;
    }
    /**
     * Einstellungsfenster.
     * @param e ActionEvent
     */
    @Override
    public void actionPerformed(final ActionEvent e) {
...
        folderButton.addActionListener(new ButtonListener(sammlungP));
...
   }
}
ButtonListener
Java:
class ButtonListener implements ActionListener {

    private final SammlungPanel sammlungP;

    public ButtonListener(SammlungPanel sammlungP) {
        this.sammlungP = sammlungP;
    }

    /**
     * ...
     * @param actionEvent ...
     */
    @Override
    public void actionPerformed(final ActionEvent actionEvent) {
...
                sammlungP.getSammlungPanel2().removeAll();
                sammlungP.getSammlungPanel2().add(jTree);
                sammlungP.getSammlungPanel2().revalidate();
                sammlungP.getSammlungPanel2().repaint();
...
    }
}
SammlungPanel
Java:
public class SammlungPanel extends JPanel {

    private final transient JPanel sammlungPanel2;

    public final JPanel getSammlungPanel2() {
        return sammlungPanel2;
    }

    public SammlungPanel(final MenuLayoutDemo mLayout)
            throws ClassNotFoundException, SQLException {
...
        sammlungPanel2 = new JPanel();
...
    }
}

als fehler bekomm ich ne NullPointerException wenn ich auf den Knopf drücke, welchem ButtonListener zugeordnet ist. also scheint meine übergabe noch nicht zu stimmen.
 

Michael...

Top Contributor
sammlungP wird nie initialisiert und ist null.
Ansonsten ist das Konstrukt mit dem Durchschleifen einer Referenz durch mehrere Klassen eher unschön.
 

Michael...

Top Contributor
wie kann ich das ganze denn schöner umsetzen?
Ist so pauschal schwer zu sagen, hängt davon ab, was genau Du vorhast. Allgemein würde ich mal das ModelViewController Pattern empfehlen.
Konkret solltest Du Dir mal die Fragestellen, ob Dein Listener sammlungP überhaupt kennen muss/sollte, oder ob er nicht besser eine Referenz auf ein Objekt von MenuLayoutDemo kennen sollte und diese Objekt auffordern entwas zu machen. MenuLayoutDemo kann dann ja intern diese "Aufforderung" weitder delegieren.

Ausserdem: Exceptions (throws ClassNotFoundException, SQLException) bis zur static main einfach durchzureichen ist für den Fall, dass solch eine Exception auftritt eher ungünstig. Dann bekommst Du ja garnicht mit wann und wieso eine Exception aufgetreten ist und Du fragst Dich irgendwann warum Deine Anwendung abschmiert. Mein Grundsatz bei Exceptions: So früh abfangen wie möglich, so weit durchreichen wie nötig.
 

coree

Mitglied
hab nun erstmal getSammlungPanel2() public static und sammlungPanel2 private static gesetzt, damit gehts halt erstmal.
werd mir aber deinen vorschlag die tage auch mal genauer ansehen. danke
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J private statische List - Datenbankverbindung AWT, Swing, JavaFX & SWT 2
J private inner class AWT, Swing, JavaFX & SWT 4
M private Variable übergeben AWT, Swing, JavaFX & SWT 12
N Rückgabewerte bei private void jButton1ActionPerformed AWT, Swing, JavaFX & SWT 4
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M AWT Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
M JavaFX Slide Panel AWT, Swing, JavaFX & SWT 2
P Swing Panel nicht sichtbar AWT, Swing, JavaFX & SWT 1
M Swing JtextField Panel in ander Panel aufrufen AWT, Swing, JavaFX & SWT 0
M Panel in geerbter JFrame Klasse adden AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
D Swing Bei Button Click neues Panel laden AWT, Swing, JavaFX & SWT 3
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
X Java Panel zeitweise repainten AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
B zweidimensionales Buttonarray auf Panel AWT, Swing, JavaFX & SWT 11
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Panel lässt sich nicht bewegen AWT, Swing, JavaFX & SWT 2
E Panel mit Leben füllen AWT, Swing, JavaFX & SWT 2
K Swing Maus in Panel einsperren AWT, Swing, JavaFX & SWT 8
D Panel in Panel zentriert nicht richtig AWT, Swing, JavaFX & SWT 3
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
P Swing Button über gesamtes Panel AWT, Swing, JavaFX & SWT 2
O LayoutManager Panel in Panel "maximieren" AWT, Swing, JavaFX & SWT 2
C AWT Horizontale Linie in einem Panel AWT, Swing, JavaFX & SWT 12
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
B Export eines Panel mit ScrollBar AWT, Swing, JavaFX & SWT 4
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
bluerob Panel im BorderLayout South wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
M Swing Panel klassenübergreifend ändern AWT, Swing, JavaFX & SWT 6
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
H Scroll Panel wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 6
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
X Swing Panel Extra Klasse & Aufruf über Button AWT, Swing, JavaFX & SWT 18
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
S Vaadin: Panel AWT, Swing, JavaFX & SWT 10
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
C Etwas durchsichtig machen über einem Panel AWT, Swing, JavaFX & SWT 7
K Panel zu Laufzeit ändern AWT, Swing, JavaFX & SWT 6
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
D Panel aus externer Klasse holen AWT, Swing, JavaFX & SWT 2
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
J JPanel mit anderem Panel aus anderer Klasse setzen AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Panel-Zeichnung erscheint nicht AWT, Swing, JavaFX & SWT 7
S Panel rapaint AWT, Swing, JavaFX & SWT 18
T AffineTransform wirkt sich nur auf dem ersten Panel aus AWT, Swing, JavaFX & SWT 3
K Swing: Panel in Panel erzeugen AWT, Swing, JavaFX & SWT 11
M Panel in SWT einfügen AWT, Swing, JavaFX & SWT 12
T auf Panel zeichnen AWT, Swing, JavaFX & SWT 4
A FormLayout Panel-Breite AWT, Swing, JavaFX & SWT 7
Dit_ "Expandable" Panel ? AWT, Swing, JavaFX & SWT 6
A Panel-Unterklasse funktioniert nicht AWT, Swing, JavaFX & SWT 16
A Panel zu klein AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben