当前位置: 首页 > 面试题库 >

再次更新JFrame

蓟和煦
2023-03-14
问题内容

下面显示的以下代码会将3个JLabel添加到JFrame中,然后删除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();
    }
}

我面临的一个小问题是,它正在重新绘制到新的frame(frameTwo)而不是旧的frame(frameOne)。

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


问题答案:
  1. Simpy使用CardLayout来交换视图。
  2. 请使用Swing计时器,而不要使用当前的后台线程,因为您当前的代码对Swing线程而言并不安全,并且存在发生危险的不可预测的线程异常的风险。
  3. 我会给主JPanel CardLayout,然后添加一个JLabel来保存带有合适的String常量的JPanel。
  4. 然后,我将使用JPanel添加到主CardLayout中,将一个空的JLabel添加到add方法中的另一个String常量中。即add(new JLabel(), BLANK_COMPONENT);
  5. 然后,在Swing Timer中,只需调用next()CardLayout对象,传入使用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();
         }
      });
   }
}


 类似资料:
  • 所以,我想通了摇摆工人的事情。 然而,另一个问题出现了(去图)... Swing worker实际上管理错误报告和电子邮件发送,并且电子邮件是一个长时间(超过0 . 5秒)的任务,它很方便... 为了防止我的程序在错误处理之前继续执行,我必须暂停EDT线程(用那个同步的东西)。然而,这也会暂停不确定JProgressBar的酷小动画,以及在发送消息时正在使用的动画,所以,当EDT暂停时。 我的问题

  • 印度的《公司法》有一些变化。其中值得注意的是,有一项规定,如果公司进行了数字签名,则可以以电子形式维护其登记册。以下几点让我感到困惑: > 记录一旦以数字方式标注日期和签名,不得编辑或更改; 记录应能够根据法案的规定或根据法案制定的规则进行更新,更新日期应能够记录在每次更新中。 想象一下,我们正在对PDF中的表进行数字签名。如果表中最初有2行,并且用户对pdf进行数字签名。现在,我们在pdf中再添

  • 使用最新的Selenium WebDriver v 2.50.00,我(再次)遇到以下异常: 在45000 ms内启动套接字失败。试图连接到以下地址:127.0.0.1:7055 执行: Firefox 43及更高版本会出现这种情况。我已经将Firefox降级到第39版,在那里它可以正常工作。 似乎这个问题在不同版本的Selenium和Firefox中出现过几次,请参见此处或此处。 这方面有什么解

  • 我有一个项目使用以下代码调用componentDidMount()上的API服务 我的组件将过滤器从redux存储区传递到API调用。 但是,如果过滤器通过另一个组件发生变化怎么办?我似乎找不到正确的生命周期方法来在发生这种情况时重新调用api。

  • 问题内容: 储存程序 在此存储过程中,我有两个update语句。如果第一次更新成功执行,然后第二次执行。需要进行哪些更改? 问题答案: 在第一个之后,您可以检查受影响的行数。 如果返回的结果是所需的更新数量(可能> 0),则仅触发第二个。 可以通过检查受影响的行数来包围第二个。