技术开发 频道

关于增强Swing您所不知道的5件事

  5. Swing 线程

  在本文发布示例时,您可能遇一些奇怪内容,看起来像运行时错误。如果是这样,您的应用程序有可能出现了一个常见的线程处理错误。许多 Java 开发人员不明白,Swing 应用程序应该运行在它们自己的线程中,而不是主执行线程中。Swing 将忽略这种错误 ,但是迄今为止引入的很多组件却不会。

  Java 平台提供了一个名为 SwingUtilities 的类,可以帮助您将您的 Swing 应用程序发布到它自己的线程上,该类有一个 invokeLater() 方法,您可以用来启动 Swing 应用程序。清单 4 显示了使用 SwingUtilities.invokeLater() 方法发布的 JXTreeTable:

  清单 4. 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();
    }
}

  构造器将 JFrame 的可视度设置为 true,当 Swing 运行在应用程序的主线程上是,这是不被允许的。清单 4 创建了一个单独的类 AppStarter,它扩展 Thread 并创建 SwingXExample 类。main() 方法创建一个 AppStarter 类实例,并将它传递给 SwingUtilities.invokeLater() 方法,来正确启动应用程序。尽量养成以这种方式运行您 Swing 应用程序的习惯 — 不仅是因为它正确,而且如果不这样做,有些第三方组件可能无法运行。

  结束语

  Swing 是一个功能强大的库,允许您在 Java 平台上构建用户界面,但是它缺少一些您想合并到您应用程序中的现代组件。在本文中,我为您提供一些有用的技巧,来美化(并现代化)您的 Swing 应用程序。像 Substance、SwingX 这类开源项目以及 Java Look-And-Feel Graphics Repository 使得在 Java 平台上构建丰富的用户界面比较容易。

0
相关文章