我拿我自己正在做的一个界面来介绍一下

这是是解决了清除JPanel组件并能重绘的代码

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

import javax.swing.border.Border;

import javax.swing.border.EtchedBorder;

import javax.swing.border.TitledBorder;

public class TestFrame extends JFrame implements ActionListener {

JLabel welcome = new JLabel("欢迎使用报刊订阅系统:");

JLabel user = new JLabel("user");

JButton linsert = new JButton("报 刊 录 入");

JButton lsearch = new JButton("报 刊 查 询");

JButton laccount = new JButton("报 刊 统 计");

JLabel lcenter = new JLabel("欢迎试用!");

JPanel ptop = new JPanel();

JPanel pleft1 = new JPanel();

JPanel pleft2 = new JPanel();

JPanel pleft3 = new JPanel();

JPanel pleft = new JPanel();

JPanel pcenter = new JPanel();

public TestFrame() {

super("企业报刊订阅管理系统");

ptop.setLayout(new FlowLayout(0));

pleft.setLayout(new GridLayout(8, 1));

ptop.add(welcome);

ptop.add(user);

pleft1.add(linsert);

pleft2.add(lsearch);

pleft3.add(laccount);

pleft.add(pleft1);

pleft.add(pleft2);

pleft.add(pleft3);

pcenter.add(lcenter);

ptop.setBorder(new EtchedBorder(EtchedBorder.RAISED));

pleft.setBorder(new EtchedBorder(EtchedBorder.RAISED));

pcenter.setBorder(new EtchedBorder(EtchedBorder.RAISED));

Border border=BorderFactory.createEtchedBorder(Color.white, Color.white);

Border title=BorderFactory.createTitledBorder(border,"订阅管理",TitledBorder.RIGHT,TitledBorder.TOP,

new Font("楷体", Font.BOLD, 26),Color.blue);

welcome.setFont(new Font("楷体", Font.BOLD, 24));

user.setFont(new Font("楷体", Font.BOLD, 20));

user.setForeground(Color.CYAN);

linsert.setFont(new Font("楷体", Font.BOLD, 20));

lsearch.setFont(new Font("楷体", Font.BOLD, 20));

laccount.setFont(new Font("楷体", Font.BOLD, 20));

lcenter.setFont(new Font("楷体", Font.BOLD, 24));

pleft.setBorder(border);

pleft.setBorder(title);

this.setSize(800, 600);

this.setLocationRelativeTo(null);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setResizable(false);

this.setLayout(new BorderLayout());

this.setVisible(true);

this.add(ptop, BorderLayout.NORTH);

this.add(pleft, BorderLayout.WEST);

this.add(pcenter, BorderLayout.CENTER);

linsert.addActionListener(this);

lsearch.addActionListener(this);

laccount.addActionListener(this);

}

public static void main(String[] args) {

new TestFrame();

}

@Override

public void actionPerformed(ActionEvent e) {

//录入

if (e.getSource() == linsert) {

pcenter.removeAll();

pcenter.repaint();

pcenter.add(Insert.setInsert());

pcenter.revalidate();

}

//查询

if (e.getSource() == lsearch) {

pcenter.removeAll();

pcenter.repaint();

pcenter.add(Search.setSearch());

pcenter.revalidate();

}

//统计

if (e.getSource() == laccount) {

pcenter.removeAll();

pcenter.repaint();

pcenter.add(Account.setAccount());

pcenter.revalidate();

}

}

}

我把清空组件和重绘放在按钮单击按钮事件里面完成的,所以主要就是按钮里面的方法。

一开始我用的是

if (e.getSource() == laccount) {pcenter.removeAll();

pcenter.add(Account.setAccount());

}

运行发现没用。

然后加了repaint()重绘图形区域

if (e.getSource() == laccount) {

pcenter.removeAll();

pcenter.repaint();

pcenter.add(Account.setAccount());

}

运行发现图形区域被清空了,但是并没有把我重绘的东西显示出来。

然后我把rapaint()去掉,在末尾用revalidate();

if (e.getSource() == laccount) {

pcenter.removeAll();

pcenter.add(Account.setAccount());

pcenter.revalidate();

}

运行后确实我重绘的东西显示出来了,但是观察后发现原来的组件斌没有删除,而是被遮盖了,注意是遮盖不是覆盖,原来的组件仍然存在,只是点击按钮后,把新添加进去的组件显示出来了,但是点击多个按钮会发现当所有按钮里面的组件都被添加进去后再点击按钮,显示的组件是最后一个,也就是组件不再刷新显示了,这有点像一个数组,把所有的组件添加进去后相同的组件不再添加。

之后我再把repaint(),添加进去

if (e.getSource() == laccount) {

pcenter.removeAll();

pcenter.repaint();

pcenter.add(Account.setAccount());

pcenter.revalidate();

}

最终得到了想要的结果,组件被清空,并且完成了自己的重绘功能

对于这个问题我的理解是:先用removeAll()移除了所有组件,但是并未刷新,所以单使用这个方法虽然内部组件确实改变了,但是界面显示不变;repaint()相当于刷新了整个面板,所以用了remover All()之后面板是空的,如果不先使用removeAll()那么接下来添加的组件会接在之前存在的组件后面(因为之前的组件未移除);然后在添加新的组件后使用revalidate(),重新对面板计算大小并且对面板中的组件进行布局,这样就把新添加的组件添加进去了。对于revalidate() JDK里面是这样说的:使用 validate 方法会使容器再次布置其子组件。已经显示容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。我觉得这里应该有一个刷新作用,添加了组件后必须刷新面板才能再次显示出来。

总结:先移除组件( removeAll() ),然后重绘面板( repaint() ),再添加组件( add() ),最后重新布局面板( revalidate() )。

以上内容是我百度后自己摸索出来的,欢迎大家批评指正!

以上内容我参考了下面的网站

http://stackoverflow.com/questions/1097366/java-swing-revalidate-vs-repaint

java jpanel清空_java怎么清除JPanel里面所有组件并重绘相关推荐

  1. java queue 清空_java swing清除事件队列

    可以以标准方式执行此操作吗? 这是场景. 开始在EDT中执行一些昂贵的操作(EDT被阻止,直到昂贵的操作结束为止). 在阻止EDT的同时,用户继续单击/拖动鼠标按钮.所有鼠标动作都记录在某处. 当ED ...

  2. Java jpanel 设置_Java中设置Jpanel的背景

    一起学习 1.创建一个类ImagePanel,代码如下 import java.awt.BorderLayout; import javax.swing.JPanel; import java.io. ...

  3. java jpanel 叠加_java – 如何在JPanel上叠加,调整大小和居中组件?

    首选大小 JProgressBar由UI委托 BasicProgressBarUI指定.下面的示例说明了各种布局管理器的效果. FlowLayout只使用UIManager默认值ProgressBar ...

  4. java panel边框_java – 如何在jPanel上设置边框?

    我的项目包括两个类,GoBoard扩展了JPanel. GoTest.java: import javax.swing.*; import java.awt.Graphics; import java ...

  5. java jpanel 滚动_java – 滚动一个JPanel

    使用JScrollPane并将其preferredSize强制为给定的大小(或将scrollPane容器LayoutManager设置为null并在scrollpane上调用setBounds()). ...

  6. java jpanel 间距_Java的 . 调整JPanel上的问题大小

    BorderLayout 没有为此任务剪切,因为它为 CENTER 组件提供了所有剩余空间 . 如果您可以将布局更改为 GridBagLayout ,则最简单的方法是将最左侧的组件全部留在空间上 . ...

  7. java jtextfield清空_java – 当鼠标点击JTextField时如何清除JTextField

    当鼠标点击该文本字段时,我需要使该程序从文本字段中清除文本.我已经尝试了一些事情,但是他们都没有为我工作. 以下是代码全部: public class TimerClassPanel extends ...

  8. java stringbuilder清空_Java中StringBuilder的清空方法比较

    StringBuilder 没有提供clear或empty方法. 清空有3种方法: 1)新生成一个,旧的由系统自动回收 2)使用delete 3)使用setLength 将三种方法循环1000万次,代 ...

  9. java jtextarea清空_Java:JTextArea类

    JTextArea文本域组件,其实跟JTextField文本框组件的使用非常相似,只不过文本框是一行,但文本域可以是多行. JTextArea类所在包 JPasswordField类的所在包不用说大家 ...

最新文章

  1. IOS视频编辑功能详解上篇-添加水印
  2. 应用hibernate中的hql语句对日期的操作总结
  3. Swift:subscript
  4. 对DIP IoC DI的理解与运用
  5. 经验共享:由备份和负载均衡
  6. 22:00直播|当加班男程序猿 被美女主播~ 捕到后...
  7. BOOST使用 proto::extends 扩展终端类型的简单示例
  8. 这份书单,给那些想学Hadoop大数据、人工智能的人
  9. 通过引入switch表达式来增强Java switch语句
  10. Atitit.java c++指针使用总结O7
  11. 自定义firefox账户服务器出错,我在确认 Firefox 账户时出现了问题
  12. C# 使用 Response 导出 Excel 单元格格式设置为文本格式
  13. PDF里面复制出来的文章,在word里去掉回车符
  14. js 读取图片路径并预览图片
  15. 什么是SpringData
  16. 怎么看域名是否解析成功
  17. 钱都花哪去了?预算费用控制管理系统帮企业精准管理“金脉”
  18. JS_鼠标移入移出触发事件
  19. Android---探究Android组件化
  20. LayUi使用switch开关,动态的去控制它是否被启用

热门文章

  1. PMP是什么?-科科过
  2. “真爱”黑客 Fooying 手把手教你追妹子 | 宅客故事
  3. 那些年,面过的奇葩面试(java)
  4. jQuery事件机制
  5. 华为防火墙:五种NAT类型以及配置NAT策略。
  6. 一個玩弄企業高管帶給我可笑經歷的公司—“北京锡恩企业管理顾问公司”
  7. Non-terminating decimal expansion; no exact representable decimal result
  8. 邮件群组是什么?如何建立邮件群组,群组邮件怎么看?
  9. 纹波测量 以及 ATX 12V PC 电源 介绍
  10. 前百度工程师出走后纷纷复制创业密码