5. Swing 线程
在本文发布示例时,您可能遇一些奇怪内容,看起来像运行时错误。如果是这样,您的应用程序有可能出现了一个常见的线程处理错误。许多 Java 开发人员不明白,Swing 应用程序应该运行在它们自己的线程中,而不是主执行线程中。Swing 将忽略这种错误 ,但是迄今为止引入的很多组件却不会。
Java 平台提供了一个名为 SwingUtilities 的类,可以帮助您将您的 Swing 应用程序发布到它自己的线程上,该类有一个 invokeLater() 方法,您可以用来启动 Swing 应用程序。清单 4 显示了使用 SwingUtilities.invokeLater() 方法发布的 JXTreeTable:
清单 4. SwingXExample.java
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 平台上构建丰富的用户界面比较容易。