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();
}
}