У меня была такая же проблема и исправлена ее вызовом setVisible (true); JFrame, который я использовал.
Пример: если ваш JFrame не обновляется после использования:
jframe.setContentPane(new MyContentPane());
исправить это с:
jframe.setContentPane(new MyContentPane());
jframe.setVisible(true);
Я знаю, что это звучит глупо, чтобы сделать это, даже если ваш JFrame уже видно, но это единственный способ, который я нашел до сих пор, чтобы исправить эту проблему (предлагаемое выше решение не сработало для меня).
Вот полный пример. Запустите его, а затем раскомментируйте «f.setVisible (true)»; инструкции в классах Panel1 и Panel2, и вы увидите разницу. Не забывайте импортировать (Ctrl + Shift + O для автоматического импорта).
Основной класс:
public class Main {
private static JFrame f;
public static void main(String[] args) {
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new Panel1(f));
f.pack();
f.setVisible(true);
}
}
Panel1 класс:
public class Panel1 extends JPanel{
private JFrame f;
public Panel1(JFrame frame) {
f = frame;
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
JButton b = new JButton("Panel 1");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
f.setContentPane(new Panel2(f));
// Uncomment the instruction below to fix GUI "update-on-resize-only" problem
//f.setVisible(true);
}
});
add(b);
}
}
panel2 класс:
public class Panel2 extends JPanel{
private JFrame f;
public Panel2(JFrame frame) {
f = frame;
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
JButton b = new JButton("Panel 2");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
f.setContentPane(new Panel1(f));
// Uncomment the instruction below to fix GUI "update-on-resize-only" problem
//f.setVisible(true);
}
});
add(b);
}
}
Надежда, что помогает.
С уважением.
Спасибо, Джон, он отлично работает! – nautilusvn
+1 для ценного ввода. Просто предложение, не нужно ставить 'repaint()' вызов внутри EDT, так как безопасно вызывать 'repaint()' из любого потока, как описано [здесь] (http://stackoverflow.com/questions/9786497/safe -to-use-component-repaint-outside-edt/9786598 # 9786598) –
"подклассы компонентов Swing, которые имеют делегат UI ... должны вызывать' super.paintComponent() '" - [* The Paint Methods *] (http: //java.sun.com/products/jfc/tsc/articles/painting/index.html#callback). – trashgod