Problem med att uppdatera en JPanel

Permalänk
Medlem

Problem med att uppdatera en JPanel

Jag har en egen subklass till JPanel som jag placerar i en JFrame.
Jag lägger till en JButton som ska ersätta min myWindow med en annan instans av myWindow när den används men fönstret ändras inte. Jag har provat med repaint(), revalidate() och updateUI() utan resultat.
Hur får jag fönstret att uppdateras?

Här är min kod:

ExampleCode.java

import java.awt.FlowLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ExampleCode { /** * @param args */ public static void main(String[] args) { new ExampleCode(); } public ExampleCode() { SwingUtilities.invokeLater(new Runnable() { public void run() { MyGUI(); } }); } private MyWindow window;; private MyWindow window2; private JFrame frame; public void MyGUI(){ frame = new JFrame("Example application"); frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); JPanel myPanel = new JPanel(); JPanel myPanel2 = new JPanel(); FlowLayout layout = new FlowLayout(); frame.setLayout(layout); myPanel.setLayout(layout); myPanel2.setLayout(layout); JButton button = new JButton("Click me"); button.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { window.setMyWindow(window2); window.updateUI(); frame.repaint(); frame.getRootPane().revalidate(); frame.getRootPane().repaint(); window.revalidate(); window.getRootPane().revalidate(); } }); myPanel.add(button); myPanel2.add(new JLabel("Ändrat till myWindow2!")); window = new MyWindow(myPanel, "myWidnow"); window2 = new MyWindow(myPanel2, "myWindow2"); frame.add(window); frame.pack(); frame.setVisible(true); } }

MyWindow.java

import java.awt.BorderLayout; import javax.swing.JLabel; import javax.swing.JPanel; public class MyWindow extends JPanel{ protected String title; protected JPanel lowerPanel; public MyWindow(JPanel panel, String name){ this.title = name; this.lowerPanel = panel; initComponents(); } public void initComponents() { JPanel topPanel = new JPanel(); topPanel.add(new JLabel(title)); BorderLayout layout = new BorderLayout(); this.setLayout(layout); this.add(topPanel, BorderLayout.NORTH); this.add(lowerPanel, BorderLayout.CENTER); this.setVisible(true); } public String getTitle(){ return title; } public void setTitle(String newTitle){ title = newTitle; } public void setLowerPanel(JPanel newPanel){ lowerPanel = newPanel; } public JPanel getLowerPanel(){ return lowerPanel; } public void setMyWindow(MyWindow newMw){ title = newMw.getTitle(); lowerPanel = newMw.getLowerPanel(); updateUI(); lowerPanel.updateUI(); lowerPanel.revalidate(); revalidate(); repaint(); getRootPane().revalidate(); } }

Permalänk
Medlem

När du kör component.add(<en komponent>) sker en hel massa grejer med komponenten. Att du använder en variabel och sedan låter variabeln referera till en ny komponent innebär inte att fönstret uppdateras automatiskt; du måste ta bort den gamla komponenten och lägga till den nya, alternativt skapa om hela fönstret från scratch.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Jag provade med att ta bort den gamla och lägga till den nya och nu fungerar det.
Tack för hjälpen!