java - 再次更新 JFrame

标签 java swing

下面显示的代码将向 JFrame 添加 3 个 JLabel,然后删除这 3 个 JLabel。 2 秒后,它将重新绘制 3 个 JLabel。

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class RepaintFrameTest extends JFrame {
    private JPanel panel = new JPanel();
    private JLabel labelOne = new JLabel("label1");
    private JLabel labelTwo = new JLabel("label2");
    private JLabel labelThree = new JLabel("label3");
    public RepaintFrameTest() { 
        panel.add(labelOne);
        panel.add(labelTwo);
        panel.add(labelThree);
        add(panel);
        pack();
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(1024,768);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String args[]) {
        RepaintFrameTest frameOne = new RepaintFrameTest();
        frameOne.getContentPane().removeAll();   
        frameOne.getContentPane().validate();
        frameOne.getContentPane().repaint();
        new Thread(new RepaintThread()).start();
    }
}

class RepaintThread implements Runnable {
    @Override
    public void run() {
        try   {              
            Thread.sleep(2000);            
        }catch (InterruptedException interruptedException)  {                           
            System.out.println( "Thread is interrupted when it is sleeping" +interruptedException);             
        } 
        RepaintFrameTest frameTwo = new RepaintFrameTest();
        frameTwo.getContentPane().validate();
        frameTwo.getContentPane().repaint();
    }
}

我遇到的一个小问题是它正在重新绘制新框架 (frameTwo) 而不是旧框架 (frameOne)。

如何让它重新绘制现有框架而不是重新绘制新框架?

最佳答案

  1. Simpy 使用 CardLayout 来交换 View 。
  2. 使用 Swing 计时器而不是您当前的后台线程,因为您当前的代码不是 Swing 线程安全的并且存在有害的不可预测的线程异常的风险。
  3. 我会给主要的 JPanel CardLayout,然后添加一个 JLabel 来保存 JPanel 和合适的字符串常量。
  4. 然后我将使用 JPanel 添加到主 CardLayout,这是一个在 add 方法中使用另一个 String 常量的空 JLabel。即,add(new JLabel(), BLANK_COMPONENT);
  5. 然后我会在我的 Swing 计时器中简单地调用我的 CardLayout 对象上的 next(),传入使用 CardLayout 的主要组件:cardLayout.next(myMainJPanel);

例如,

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.event.*;

import javax.swing.*;

public class RepaintTest extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private static final int LABEL_COUNT = 3;
   private static final String LABEL_PANEL = "label panel";
   private static final Object BLANK_COMPONENT = "blank component";
   private static final int TIMER_DELAY = 2000;
   private CardLayout cardLayout = new CardLayout();

   public RepaintTest() {
      JPanel labelPanel = new JPanel();
      for (int i = 0; i < LABEL_COUNT; i++) {
         labelPanel.add(new JLabel("Label " + (i + 1)));
      }

      setLayout(cardLayout);
      add(labelPanel, LABEL_PANEL);
      add(new JLabel(), BLANK_COMPONENT);

      new Timer(TIMER_DELAY, new TimerListener()).start();

   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         cardLayout.next(RepaintTest.this);
      }
   }

   private static void createAndShowGui() {
      RepaintTest mainPanel = new RepaintTest();

      JFrame frame = new JFrame("RepaintTest");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于java - 再次更新 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276474/

相关文章:

java - Facebook 相册和照片无法通过所有需要的权限访问(GRAPH API)

java - 在 Java 中使用 HtmlUnit 得到错误和异常

java - RESTful JSON 与 Jersey 2.23.2

java - 用于 Eclipse 的 Spring 上下文 XML validator ?

java - 使用没有 "injects"指令的 Dagger 模块

java - 当一个长进程正在运行时,如何在我的 JFrame 中加载动画 GIF?

java - 如何将 jPanel 中的所有 jPanel 向左对齐?

java - JComboBox itemStateChanged 事件一次调用两次

java - 创建一个带有今天日期标签的面板,根据今天的数据更改内容

java - JPanel 中的 JButton