首页 / JAVA / java-再次更新JFrame
java-再次更新JFrame
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-再次更新JFrame,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3339字,纯文字阅读大概需要5分钟。
内容图文
下面显示的以下代码会将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();
}
});
}
}
内容总结
以上是互联网集市为您收集整理的java-再次更新JFrame全部内容,希望文章能够帮你解决java-再次更新JFrame所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。