java frame update_java-再次更新JFrame

下面显示的以下代码会将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).

如何使它重新粉刷现有框架而不是重新粉刷到新框架?

最佳答案

> Simpy使用CardLayout交换视图.

>使用Swing计时器而不是当前的后台线程,因为您当前的代码对Swing线程而言并不安全,并且会带来有害的不可预测的线程异常.

>我将给主JPanel提供CardLayout,然后添加一个JLabel来保存具有合适String常量的JPanel.

>然后,我将使用JPanel将其添加到主CardLayout中,将一个空的JLabel添加至add方法中的另一个String常量.即添加(new JLabel(),BLANK_COMPONENT);

>然后,在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();

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值