Avatar billede everclear Praktikant
08. januar 2009 - 10:15 Der er 4 kommentarer og
1 løsning

Hent JFrame fra JPanel

Jeg sidder og er ved at rode med et GUI hvor jeg benytter en JFrame, der kan åbne forskellige JPanels efter behov.

Mit problem ligger i, at jeg på mine forskellige JPanels har behov for at åbne andre JPanels på min frame. Men hvordan får jeg fat i den JFrame, som indeholder mit panel programmatisk?
Avatar billede arne_v Ekspert
08. januar 2009 - 22:36 #1
Swing komponenter har så bidt jeg husker en .getParent() metode.
Avatar billede everclear Praktikant
12. januar 2009 - 15:06 #2
Hej Arne;

Beklager ventetiden...valgte lige at ligge mig syg.

Det er rigtigt, at der er en getParent()-metode på mit JPanel. Denne returnerer en Container. Mit problem ligger bare i, at jeg ikke kan få den til at interagere med min JFrame (som åbner mit Panel).

På min JFrame åbner jeg mit Panel på følgende måde:

private void setContent(JPanel panel)
{
    panel.setSize(500, 600);

    clearContent();  // Denne sletter blot indholdet på min JFrames contentpane

    this.getContentPane().add(panel);
    this.pack();
    this.setVisible(true);
}

på mit JPanel ville jeg jo så gerne have mulighed for f.eks. at kalde min setContent-metode (som jo befinder sig på min JFrame). Kan dette lade sig gøre på nogen måde?
Avatar billede arne_v Ekspert
13. januar 2009 - 00:30 #3
Du skal bare gå tilpas langt tilbage, så kommer di til din JFrame.

Prøv og køre følgende program:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;

public class PanelWalk extends JFrame implements ActionListener {
    public PanelWalk() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setName("My frame");
        JPanel p1 = new JPanel();
        p1.setName("My panel #1");
        p1.setLayout(new BorderLayout());
        JPanel p2 = new JPanel();
        p2.setName("My panel #2");
        p2.setLayout(new BorderLayout());
        JButton btn = new JButton("Check");
        btn.setName("My button");
        btn.addActionListener(this);
        p2.add(btn, BorderLayout.CENTER);
        p1.add(p2, BorderLayout.CENTER);
        getContentPane().add(p1, BorderLayout.CENTER);
        pack();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        JButton btn = (JButton)e.getSource();
        JPanel p2 = (JPanel)btn.getParent();
        JPanel p1 = (JPanel)p2.getParent();
        JPanel cp = (JPanel)p1.getParent();
        JLayeredPane lp = (JLayeredPane)cp.getParent();
        JRootPane rp = (JRootPane)lp.getParent();
        JFrame f = (JFrame)rp.getParent();
        String stack = btn.getClass().getName() + " : " + btn.getName() + "\r\n" +
                      p2.getClass().getName() + " : " + p2.getName() + "\r\n" +
                      p1.getClass().getName() + " : " + p1.getName() + "\r\n" +
                      cp.getClass().getName() + " : " + cp.getName() + "\r\n" +
                      lp.getClass().getName() + " : " + lp.getName() + "\r\n" +
                      rp.getClass().getName() + " : " + rp.getName() + "\r\n" +
                      f.getClass().getName() + " : " + f.getName();
        JOptionPane.showMessageDialog(null, stack);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new PanelWalk();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede everclear Praktikant
13. januar 2009 - 11:05 #4
Det er helt perfekt arne! Du er min egen personlige superman!:) Smid et svar, så er der point. Og mange mange tak!
Avatar billede arne_v Ekspert
13. januar 2009 - 14:39 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester