精华内容
下载资源
问答
  • 学swing
    2019-09-29 19:02:31

    貌似很多人说企业java开发很少用到swing的。而且我(学生)自己也写了很长时间的swing界面。感觉那些界面太丑了。呵呵。可能是我水平不行,所以我想问一下,java swing在企业这一块应用如何?改学到什么程度就行了。因为这一块知识细节太杂,太多、我想将更多的精力放在java EE这一块,以及安卓这一块。先谢谢大家的回答了。

     

    起码应该了解swing的事件处理、线程模型、布局管理、渲染器、编辑器,或者再看看它的mvc模型,就算工作中用swing很少,但这些概念在大多数富客户端框架中都是通用的。至于外观,很容易改的啊,自定义组件也不难。
    个人体验:做过一段时间的swing开发,积累的经验让我受益匪浅。swing的强项在于架构。不能否认的确实精良

    转载于:https://www.cnblogs.com/iceTing/archive/2013/03/29/2988168.html

    更多相关内容
  • JAVA程序员到底要不要学Swing

    千次阅读 2021-05-26 16:49:57
    Swing是什么? 1)AWT 在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT是一个重量级组件,使用比较麻烦,且设计出的图形界面不够...

    Swing是什么?

    1)AWT
    在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT是一个重量级组件,使用比较麻烦,且设计出的图形界面不够美观功能也非常有限。为此,Sun公司对AWT进行改进,提出了Swing组件,提供了更加丰富的组件和功能,来满足GUI设计的一切需求。

    2)Swing
    Swing是一个用于开发Java应用程序用户界面的开发工具包。使用 Swing 来开发图形界面比 AWT 更加优秀,因为 Swing 是一种轻量级组件,它采用纯 Java 实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色。除此之外,Swing 提供了比 AWT 更多的图形界面组件,Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。

    Swing能够干什么?
    1)比如医院、停车收费的软件。

    2)做各种小游戏,提升视觉感。

    3)Intellij IDEA就是java swing开发的
     

    Swing为什么发展不好?
    1)运行Swing程序,用户的电脑上必须有java运行环境,这个不太现实也很不方便。

    2)本身用Swing开发出来的客户端本身比较大,客户端也需安装到用户的电脑上。

    3)如果遇到不同的操作系统,需要为不同的操作系统开发一套客户端。

    4)B/S系统的强势崛起,因为B/S架构多用WEB网页进行开发,不需要安装客户端,在浏览器上打开,一旦代码发生变更,客户端不需要进行升级。
     

    swing要不要学?
    1)初学Java的同学可能会觉得敲代码比较枯燥无味,自己辛苦写的代码却只能在控制台打印出来,感受不到交互、没有用户体验,Swing刚好解决了这一问题。

    学习Swing需要花很多时间和精力吗?答案不需要

    1)Swing是基于java语法,学了java使用它就没有什么门槛,也不需要过渡,并没有要学习接触新的语言。

    2)学习常用布局、常用的组件、常用的容器。这些都相对比较固定,上手容易。

    3)绘图的学习,绘制也相对比较简单,学会可以做很多小游戏,装逼利器。

    学习swing能带来什么?

    1)学习java不再是简单无趣的System.out....,用swing有用户体验,提升成就感、信心。

    2)如果是做小游戏,能够很好练习线程的使用、业务逻辑的处理。

    3)布局,常用的组件等,对于以后学习web也是有一定帮助的,因为它们有着类似的设计思想。

    4)绘图的语法与JavaScript canvas语法也是非常的接近,学会了swing绘图,何愁canvas不会?

    5)Swing本身就是非常优秀的,通过使用可以学习它的设计思想。

    有相对较好java基础不建议学,除非有特殊要求(开发需要、自己爱好、装逼用)

    还是多学习框架,比如springMVC、spring、springboot、Mybatis,考虑前端的话框架 node.js、 vue.js等。

    Swing必要的时候,可以自己再去研究一下,java基础好了学习很容易。

    Swing对于工作来说没有特别大的需求以及帮助,但是对于初学者而言视觉效果比较好,不会觉得枯燥
     

    展开全文
  • 历史学swing用户界面组件PPT学习教案.pptx
  • 通过例子学习swing图形用户界面的设计精品.ppt
  • 通过例子学习swing图形用户界面的设计.ppt
  • 老Java程序员谈谈swing要不要

    万次阅读 多人点赞 2021-05-23 17:02:29
    老java程序员谈谈要不要学swing Swing是什么? 1)AWT 在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT的起初设想就是为了统一...

    老Java程序员谈谈Swing要不要学

    老java程序员谈谈要不要学swing

    Swing是什么?

    1)AWT

    在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT的起初设想就是为了统一实现不同操作系统的图像界面,但问题是,不同操作系统图形库的功能可能不一样(比如按钮,在不同系统的就表现不一样),在一个平台上存在的功能在另外一个平台上则可能不存在,为此AWT不得不通过牺牲功能来实现平台无关性。不仅如此,AWT还是一个重量级组件,使用比较麻烦,且设计出的图形界面不够美观功能也非常有限。为此,Sun公司对AWT进行改进,提出了Swing组件,提供了更加丰富的组件和功能,来满足GUI设计的一切需求。

    2)Swing

    Swing是一个用于开发Java应用程序用户界面的开发工具包。使用 Swing 来开发图形界面比 AWT 更加优秀,因为 Swing 是一种轻量级组件,它采用纯 Java 实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色。除此之外,Swing 提供了比 AWT 更多的图形界面组件,Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。

    为了和 AWT 组件区分,Swing 组件在javax.swing.*包下,类名均以 J 开头,例如: JFrame、JLabel、JButton等,而在AWT中叫Frame、Label等。

    Swing能够干什么?

    1)做系统,比如医院的软件。

    2)做各种小游戏,提升逼格。

    3)Intellij IDEA就是java swing开发的

    4)毕业设计用的挺多。

     

    Swing容器

    Swing 中容器可以分为两类:顶层容器和中间容器,容器类都是继承自 Container 类。

    顶层容器:

    是进行图形编程的基础,一切图形化的东西都必须包括在顶层容器中。Swing中有三种顶层容器,分别是JFrame、JDialog 和 JApplet。

    中间容器:

    是容器组件的一种,也可以承载其他组件,但中间容器不能独立显示,必须依附于其他的顶层容器。常见的中间容器有 JPanel、JScrollPane、JTabbedPane 和 JToolBar。

     

    Swing布局

    1)FlowLayout(流式布局)

    流式布局管理器:按水平方向依次排列放置组件,排满一行,换下一行继续排列。

    2)GridLayout(网格布局)

    网格布局管理器:按指定行列数分隔出若干网格,每一个网格按顺序放置一个控件。

    3)GridBagLayout(网格袋布局)

    网格袋布局管理器:每个组件可占用一个或多个网格,可将组件垂直、水平或沿它们的基线对齐。

    4)BoxLayout(箱式布局)

    箱式布局管理器:它把若干组件按水平或垂直方向依次排列放置。

    5)GroupLayout(分组布局)

    分组布局管理器:将组件按层次分组(串行 或 并行),分别确定 组件组 在 水平 和 垂直 方向上的位置。

    6)CardLayout(卡片布局)

    卡片布局管理器:它将容器中的每个组件看作一张卡片,一次只能看到一张卡片,其他卡片被遮住。

    7)BorderLayout(边界布局)

    边界布局管理器:它把 Container 按方位分为 5 个区域(东、西、南、北、中),每个区域放置一个组件。

    8)SpringLayout(弹性布局)

    弹性布局管理器:通过定义组件四条边的坐标位置来实现布局。

    9)null(空布局)

    空布局:也叫绝对布局,通过设置组件的坐标和宽高来布置组件。

     

    看起来有很多是不是很吓人,其实不然,我们主要掌握以下4种

    1、边界布局(BorderLayout)

    2、流式布局(FlowLayout)

    3、网格布局(GridLayout)

    4、null(空布局)

     

    Swing常用组件

    组件名称定义
    JButton按钮,可以设置背景图片或文字
    JCheckBox复选框组件
    JComboBox下拉列表框,可以在下拉显示区域显示多个选项
    JFrame框架类
    JDialog对话框
    JLabel标签组件
    JRadioButton选按钮
    JList代表能够在用户界面中显示一系列条目的组件
    JTextField文本框
    JPasswordField密码框
    JTextArea文本区域
    JOptionPane对话框

    如何创建Swing窗体程序

    1.实例化JFrame对象,也就是创建一个窗体。

    2.设置窗体的相关属性。

    3.获取一个容器。

    4.创建组件。

    5.向容器添加组件。

    6.使窗体可视。

    import java.awt.Container;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    ​
    public class SwingLearn {
        public static void main(String[] args) {
            //实例化 JFrame
            JFrame frame = new  JFrame();
            //设置相关属性
            frame.setTitle("Swing学习");//标题
            frame.setSize(300,300);//窗体大小
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭按钮是关闭程序
            frame.setLocationRelativeTo(null);   //设置居中
            frame.setResizable(false); //不允许修改界面大小
            
            //获取容器
            Container container = frame.getContentPane();
            frame.setLayout(null);
            //创建按钮
            JButton jButton = new JButton("我是按钮");
            jButton.setBounds(100, 100, 100, 40);
            //按钮添加到容器中
            container.add(jButton);
            
            //设置显示
            frame.setVisible(true);
        }
    ​
    }

     

    Swing为什么发展不好?

    1)运行Swing程序,用户的电脑上必须有java运行环境,这个不太现实也很不方便。

    2)本身用Swing开发出来的客户端本身比较大,客户端也需安装到用户的电脑上。

    3)如果遇到不同的操作系统,需要为不同的操作系统开发一套客户端。

    4)B/S系统的强势崛起,因为B/S架构多用WEB网页进行开发,不需要安装客户端,在浏览器上打开,一旦代码发生变更,客户端不需要进行升级。

     

    swing要不要学?

    1)java初学者和学校学生

    初学Java的同学可能会觉得敲代码比较枯燥无味,自己辛苦写的代码却只能在控制台打印出来,感受不到交互、没有用户体验,Swing刚好解决了这一问题。

    有人可能要说,现在web方向那么火,直接学web不就行了,其实web也有很多东西要学,对编程初学者来说接受那么多的语言太不友好,也很困难,比如:jsp、html、JavaScript、css甚至 node.js、vue.js,初学者如果这么做,等于入门即地狱。

    学习Swing需要花很多时间和精力吗?答案不需要

    1)Swing是基于java语法,学了java使用它就没有什么门槛,也不需要过渡,并没有要学习接触新的语言。

    2)学习常用布局、常用的组件、常用的容器。这些都相对比较固定,上手容易。

    3)绘图的学习,绘制也相对比较简单,学会可以做很多小游戏,装逼利器。

    学习swing能带来什么?

    1)学习java不再是简单无趣的System.out....,用swing有用户体验,提升成就感、信心。

    2)如果是做小游戏,能够很好练习线程的使用、业务逻辑的处理。

    3)布局,常用的组件等,对于以后学习web也是有一定帮助的,因为它们有着类似的设计思想。

    4)绘图的语法与JavaScript canvas语法也是非常的接近,学会了swing绘图,何愁canvas不会?

    5)Swing本身就是非常优秀的,通过使用可以学习它的设计思想。

    2)有相对较好java基础

    不建议学,除非有特殊要求(开发需要、自己爱好、装逼用)

    还是多学习框架,比如Struts、spring、springboot、Hibernate,考虑前端的话框架 node.js、 vue.js等。

    Swing必要的时候,可以自己再去研究一下,java基础好了学习很容易。

     

    看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏 ,能关注一波就更好了。

    欢迎大家留言一起讨论!

     

     

    展开全文
  • 拖放支持 Drag & Drop,一个可拖拽排序的列表,以及一个拼图游戏的实现* 课程特色 *轻快 - 采用小章节教学,起来轻松实用 - 以实际工程需要出发来设计课程有趣 - 穿插大量特效实例,增加趣味性和学员的成就感专业...
  • ☆ Java程序员居家旅行必备课程 ☆Java学习指南系列的第3篇,承接高级语法篇,介绍基于Java Swing的GUI界面程序开发的技术。Swing系列教程分为两篇:(1) Swing入门篇 (2) Swing高级篇。通过本篇的训练,学员可以较...
  • java学习SWING

    2008-11-01 16:06:26
    SWING-III.pptJava学习资料 运用File类进行文件操作 理解流,标准输入/输出流的概念 运用FileInputStream和FileOutputStream类读写文本文件 运用BufferedReader和BufferedWriter类读写文本文件 运用DataInputStream...
  • 最近学习 Swing 的问题

    2016-06-30 14:22:28
    模拟一个简单的注册窗口,写到性别的时候 男 女只能选一个,小弟采用的是匿名对象的写法可是程序报错 不知道是不是写法不对。望指教: 代码如下: // x性别 p.add(new JLabel("性别")); ... * p.add(new ...
  • import java.awt.*; import javax.swing.*; import java.awt.event.*; class myFrame extends JFrame{ public void firstFrame(){ ...刚学swing 还没学监听这方面 addActionListener方法是抄书里写的 求解决 谢谢。
  • java swing 学习资料

    2018-10-03 16:37:41
    java swing 的学习资料,附带代码,下载即运行,很容易上手的一个例子哦
  • 一、课程简介本课程是基于Java Swing 技术的项目实战教程,每章为一个项目实例。前置课程为 Swing入门篇 和 Swing高级篇。 以下项目中,界面部分使用 Swing 实现,为了实现项目需求,一般还会结合使用 Swing 之外的...
  • Java Swing 学习代码

    2018-07-01 11:41:30
    计算器,文本框,复选框,单选按钮,边框,组合框,滑块,菜单,快捷键加速器,禁用启用菜单,复杂布局,网格组布局,GBC,对话框Java Swing部分基础代码
  • 1. 遇到的问题 今天在做项目的时候遇到一个问题,就是一个无法定位错误的问题:...= 2,输出的错误信息并没有对应到我编写的代码部分,也就是说我写的代码没有问题,是swing内部的问题?问题如下: Excep...

    1. 遇到的问题

            今天在做项目的时候遇到一个问题,就是一个无法定位错误的问题:Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2,输出的错误信息并没有对应到我编写的代码部分,也就是说我写的代码没有问题,是swing内部的问题?问题如下:

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
    	at java.util.Vector.elementAt(Vector.java:474)
    	at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
    	at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2012)
    	at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
    	at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
    	at javax.swing.JComponent.paintComponent(JComponent.java:780)
    	at javax.swing.JComponent.paint(JComponent.java:1056)
    	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)
    	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
    	at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
    	at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
    	at javax.swing.JComponent._paintImmediately(JComponent.java:5158)
    	at javax.swing.JComponent.paintImmediately(JComponent.java:4969)
    	at javax.swing.RepaintManager$4.run(RepaintManager.java:831)
    	at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
    	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
    	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
    	at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
    	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
    	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    	at java.awt.EventQueue.access$500(EventQueue.java:97)
    	at java.awt.EventQueue$3.run(EventQueue.java:709)
    	at java.awt.EventQueue$3.run(EventQueue.java:703)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

            笔者的代码如下,自以为开了一个新线程就已经能够很好的防止UI阻塞就足够了,并且开始使用的时候并没有错,上述错误也只是在极少数的情况下抛出来(这是最烦的,不太容易复现,所以需要反复地运行):

    // 开辟新的线程运行实验【防止UI线程阻塞】
    Thread mainThread = new Thread(new Runnable() {
        @Override
        public void run() {
    
            try {
                // 显示实验结果到表格
                DefaultTableModel mm = new DefaultTableModel();
    
                // 读取实验结果【位于F:\JmetalResult\Experiment\QualityIndicatorSummary.csv】
                String filePath = resultPath + "QualityIndicatorSummary.csv";
    	        
                FileReader reader = new FileReader(filePath);
                BufferedReader br = new BufferedReader(reader);
    
                String line;
    
                // 读取列名
                if ((line = br.readLine()) != null) {
                    String[] columnNames = line.split(",");
                    mm.setColumnIdentifiers(columnNames);
    
                    while ((line = br.readLine()) != null) {
                        String data[] = line.split(",");
    
                        // 一次读入一行数据
                        Vector<String> v = new Vector<>(data.length);
                        for (int i = 0; i < data.length; i++) {
                            v.add(i, data[i]);
                        }
    //输出信息
    //System.out.println(line);
                        mm.addRow(v);
                    }
                }
    
                // 关闭读写器
                br.close();
                reader.close();
    
                // 更新UI
                table1.setModel(mm);
    							
            } catch (Exception e) {
                logger.fatal(e.getMessage());
                e.printStackTrace();
                System.exit(1);
            }
        }
    }

    2. 错误原因分析

            笔者遇到的错误发生的原因:Swing中事件处理和绘画代码都在一个单独的线程中执行,这个线程就叫做事件分发线程EventDispatchThread从上面的报错提示上来看,确实,错误发生在了事件分发线程EventDispatchThread中

            事件分发线程,下面将会简称其为EDT,的作用是确保事件处理器都能串行的执行,并且绘画过程不会被事件打断。为了避免死锁的可能,你必须极度小心从事件分发线程中创建、修改、查询Swing组件以及模型。

    2.1 invokeLater和invokeAndWait

            由于Swing自身不是线程安全,如果你在其他线程访问和修改GUI组件,必须要使用SwingUtilities.invokeAndWait(runnable) 或者 SwingUtilities. invokeLater(runnable)。也就是说对非EDT的并发调用需通过invokeLater()和invokeAndWait()使请求插入到队列中等待EDT去执行。

    2.1.1 invokeLater方法

    invokeLater(runnable)方法是异步的,它会立即返回,具体何时执行请求并不确定,所以命名invokeLater是稍后调用。你可以从任何线程中调用invokeLater来请求事件分发线程以运行某段代码。你必须将这段代码放入一个Runnable对象的run方法中,并将该指定Runnable对象作为参数传递给invokeLater。 invokeLater函数会立即返回,不会等到事件分发线程执行完这段代码。这里有一个使用invokeLater的例子:

    Runnable updateAComponent = new Runnable() {
        @Override
        public void run() { 
            component.doSomething(); 
        }
    };
    SwingUtilities.invokeLater(updateAComponent);

    invokeLater必须放在run()方法体内

    2.1.2 invokeAndWait方法

            invokeAndWait方法和 invokeLater方法一样,除了invokeAndWait是直到事件分发线程已经执行了指定代码才返回。invokeAndWait(runnable)方法是同步的,它被调用结束会立即block当前线程(调用invokeAndWait的那个线程)直到EDT处理完那个请求。invokeAndWait一般的应用是取得Swing组件的数据。invokeAndWait有非常重要的准则是:它不能在EDT中被调用,否则程序会抛出Error,请求也不会去执行。任何可能的时候,你都应当使用 invokeLater而不是invokeAndWait——因为invokeAndWait很容易引起死锁。

            如果你使用invokeAndWait,要保证调用invokeAndWait的线程不持有任何其他线程在调用时刻也会需要的锁。这里有一个使用invokeAndWait的例子:

    void showHelloThereDialog() throws Exception {
        Runnable showModalDialog = new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(myMainFrame, "Hello There");
            }
        };
        SwingUtilities.invokeAndWait(showModalDialog);
    }

    类似地,一个需要获取GUI状态的线程也需要类似的处理,比如包含两个文本域的组件,可能会有如下代码:

    void printTextField() throws Exception {
        final String[] myStrings = new String[2];
    
        Runnable getTextFieldText = new Runnable() {
            public void run() {
                myStrings[0] = textField0.getText();
                myStrings[1] = textField1.getText();
            }
        };
        SwingUtilities.invokeAndWait(getTextFieldText);
    
        System.out.println(myStrings[0] + " " + myStrings[1]);
    }

    2.2 更新UI的两大原则

    1. 不要阻塞UI线程
    2. 不要在UI线程外的线程去操作UI控件

    2.2.1 Swing程序中的线程

    一个Swing程序中一般有下面三种类型的线程: 

    1. 初始化线程(Initial Thread)
    2. UI事件调度线程(EDT)
    3. 任务线程(Worker Thread)

            初始化线程:每个程序必须有一个main方法,这是程序的入口。该方法运行在初始化或启动线程上。初始化线程读取程序参数并初始化一些对象。在许多Swing程序中,该线程主要目的是启动程序的图形用户界面(GUI)。创建UI的点,也就是程序开始将控制权转交给UI时的点。一旦GUI启动后,对于大多数事件驱动的桌面程序来说,初始化线程的工作就结束了。

          EDT:Swing程序只有一个EDT,该线程负责GUI组件的绘制和更新,通过调用程序的事件处理器来响应用户交互。所有事件处理都是在EDT上进行的,程序同UI组件和其基本数据模型的交互只允许在EDT上进行,所有运行在EDT上的任务应该尽快完成,以便UI能及时响应用户输入。

    2.2.2 Swing编程注意事项

           从其他线程访问UI组件及其事件处理器会导致界面更新和绘制错误。——必须通过EDT刷新组件
    在EDT上执行耗时任务会使程序失去响应,这会使GUI事件阻塞在队列中得不到处理。——不能在EDT中执行其他耗时操作
    应使用独立的任务线程来执行耗时计算或输入输出密集型任务,比如同数据库通信、访问网站资源、读写大树据量的文件。——耗时操作应放到独立的任务线程中,通过SwingWorker启动
           总之,任何干扰或延迟UI事件的处理只应该出现在独立任务线程中;在初始化线程(也就是说不能在main方法中直接创建Frame!在初始化线程中应该使用invokeLater方法初始化程序界面)或任务线程同Swing组件或其缺省数据模型进行的交互都是非线程安全性操作。
           SwingWorker类帮你管理任务线程和EDT之间的交互,尽管SwingWorker不能解决并发线程中遇到的所有问题,但的确有助于分离SwingEDT和任务线程,使它们各负其责:对于EDT来说,就是绘制和更新界面,并响应用户输入;对于任务线程来说,就是执行和界面无直接关系的耗时任务和I/O密集型操作。

            最后,笔者给出代码的正确版本:

    // 开辟新的线程运行实验【防止UI线程阻塞】
    Thread mainThread = new Thread(new Runnable() {
        @Override
        public void run() {
    
            try {
                // 显示实验结果到表格
                DefaultTableModel mm = new DefaultTableModel();
    
                // 读取实验结果【位于F:\JmetalResult\Experiment\QualityIndicatorSummary.csv】
                String filePath = resultPath + "QualityIndicatorSummary.csv";
    	        
                FileReader reader = new FileReader(filePath);
                BufferedReader br = new BufferedReader(reader);
    
                String line;
    
                // 读取列名
                if ((line = br.readLine()) != null) {
                    String[] columnNames = line.split(",");
                    mm.setColumnIdentifiers(columnNames);
    
                    while ((line = br.readLine()) != null) {
                        String data[] = line.split(",");
    
                        // 一次读入一行数据
                        Vector<String> v = new Vector<>(data.length);
                        for (int i = 0; i < data.length; i++) {
                            v.add(i, data[i]);
                        }
    
                        mm.addRow(v);
                    }
                }
    
                // 关闭读写器
                br.close();
                reader.close();
    
                // 不要在UI线程外更新操作UI,这里SwingUtilities会找到UI线程并执行更新UI操作
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        table1.setModel(mm);
                    }
                });
    							
            } catch (Exception e) {
                logger.fatal(e.getMessage());
                e.printStackTrace();
                System.exit(1);
            }
        }
    }

    能够找到出错的原因,还要感谢 Swing 刷新组件java swing中两大原则: 1. 不要阻塞UI线程 2. 不要在UI线程外的线程去操作UI控件 博客的博主。关于SwingUtils的更多内容可以移步至:Java Swing线程之SwingUtilities.invokeLater解释 和 【Java线程】Swing事件分发线程EDT与SwingUtilities.invokeLater

    展开全文
  • 文章来源:电脑爱好者 作者:张剑  还记得《偷天换日》中精灵般穿梭在好莱坞车流中的Minicooper吗?马克·沃尔伯格和莎莉·赛隆就是驾驶着它在仇人的鼻子底下运走了价值千万的黄金。可是,如果现在将一辆无法奔驰的...
  • Swing桌面应用开发学习
  • 怎样学习swing

    2012-12-17 13:45:43
    看了《java编程思想》后,过一些java swing的知识,了解了一点,但深感不足。 觉得有必要改进一下学习swing的方法。 ①学习Totrial ②框架
  • 掌握JavaSwing 我从头到尾学习Java Swing的项目
  • package com.swing; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.UR
  • swing 学习

    2019-03-24 02:26:17
    NULL 博文链接:https://dadi520.iteye.com/blog/726637
  • package com.swing; import java.awt.Container; import java.awt.GridLayout; ...import javax.swing.JButton;...import javax.swing.JFrame;...import javax.swing.JPanel;...import javax.swing.WindowConstants
  • swing学习

    2012-02-24 17:11:10
    swing学习
  • NULL 博文链接:https://huangrongyou.iteye.com/blog/1610287
  • java Swing实现图书管理系统

    千次阅读 多人点赞 2020-01-04 20:52:40
    Java Swing 开发工具和环境 Eclipse JDK 1.7 Mysql 5.6 Win10 操作系统 2.图书管理系统数据库设计 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `...
  • package com.swing; import java.awt.Container; import javax.swing.JButton;...import javax.swing.JFrame;...import javax.swing.WindowConstants;... * 在Swing中,每个组件在容器中都有一个具体的位置和大小,
  • 技术采用 :Mysql+Swing+Java 页面风格:图书管理系统 界面好看风格大方 ,能够学习swing界面代码编写以及jdbc封装操作还有java语法练习 适用人群:学生、初学者、小白、小黑 适用场景:课程设计,课程结束小项目...
  • 由此可见,基础知识的准备对于我们学习任何事物都至关重要,那么,就让我们从认识Swing的一些基础功能开始,启动我们建造罗马的伟大工程吧! 前言  Java咖啡馆已经开张不少时日了,如果你已经喜欢上了Java这杯咖啡...
  • package com.swing; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Graphics;...import javax.swing.Icon; import javax.swing.JFrame; import javax.sw
  • 学习Swing的文档资料

    2007-07-24 19:38:42
    好学实用,好使请留言哟!!!!!!!!!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,170
精华内容 20,068
关键字:

学swing