返回顶部

收藏

Swing 线程

更多

您可能遇一些奇怪内容,看起来像运行时错误。如果是这样,您的应用程序有可能出现了一个常见的线程处理错误。许多 Java 开发人员不明白,Swing 应用程序应该运行在它们自己的线程中,而不是主执行线程中。Swing 将忽略这种错误 ,但是迄今为止引入的很多组件却不会。Java 平台提供了一个名为 SwingUtilities 的类,可以帮助您将您的 Swing 应用程序发布到它自己的线程上,该类有一个 invokeLater() 方法,您可以用来启动 Swing 应用程序。清单 4 显示了使用 SwingUtilities.invokeLater() 方法发布的 JXTreeTable:构造器将 JFrame 的可视度设置为 true,当 Swing 运行在应用程序的主线程上是,这是不被允许的。清单 4 创建了一个单独的类 AppStarter,它扩展 Thread 并创建 SwingXExample 类。main() 方法创建一个 AppStarter 类实例,并将它传递给 SwingUtilities.invokeLater() 方法,来正确启动应用程序。尽量养成以这种方式运行您 Swing 应用程序的习惯 — 不仅是因为它正确,而且如果不这样做,有些第三方组件可能无法运行。

SwingXExample.java

package com.geekcap.swingx;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

import org.jdesktop.swingx.JXTreeTable;

import com.geekcap.swingx.treetable.MyTreeTableModel;

public class SwingXExample extends JFrame 
{
    private JTabbedPane tabs = new JTabbedPane();

    private MyTreeTableModel treeTableModel = new MyTreeTableModel();
    private JXTreeTable treeTable = new JXTreeTable( treeTableModel );

    public SwingXExample()
    {
        super( "SwingX Examples" );

        // Build the tree table panel
        JPanel treeTablePanel = new JPanel( new BorderLayout() );
        treeTablePanel.add( new JScrollPane( treeTable ) );
        tabs.addTab( "JXTreeTable", treeTablePanel );

        // Add the tabs to the JFrame
        add( tabs );

        setSize( 1024, 768 );
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation( d.width / 2 - 512, d.height/2 - 384 );
        setVisible( true );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }

    public static void main( String[] args )
    {
        AppStarter starter = new AppStarter( args );
        SwingUtilities.invokeLater( starter );
    }
}

class AppStarter extends Thread
{
    private String[] args;

    public AppStarter( String[] args )
    {
        this.args = args;
    }

    public void run()
    {
        SwingXExample example = new SwingXExample();
    }
}

标签:线程,Swing

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 朴人博客 发表 2012-10-18 15:12:07 Java GUI编程中有关swing组件的阻塞
  2. 蓝飞 发表 2013-05-08 18:48:45 [ACM_Tyvj_1011]传纸条(双线程动态规划解法)
  3. 博主 发表 2013-08-19 19:15:00 pystack--python stack trace--让python打印线程栈信息
  4. Alpha 发表 2014-02-25 16:09:52 线程基础之数据竞争与锁
  5. admin 发表 2014-08-22 08:48:11 锁的使用优化
  6. 博主 发表 2013-04-07 00:00:00 css3是个独立的ui线程
  7. 博主 发表 2014-01-12 14:52:00 Ruby on Rails 线程安全代码
  8. 博主 发表 2014-06-18 07:58:03 java线程:概念与原理
  9. 博主 发表 2015-04-24 08:16:37 coreData 深入理解4 --总结 (线程安全与同步--iOS5 前后对比)
  10. 博主 发表 2015-07-02 09:54:02 Java线程同步之Thread.join方法
  11. Harries 发表 2016-03-04 15:18:01 Peterson算法实现spin lock
  12. 博主 发表 2016-06-06 11:02:56 四种方法使Map线程安全

发表评论