- 浏览: 190799 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
wanglijunjsj:
谢谢,很有用
java log4j的一些总结 -
lxb_champagne:
this.init(); 类都没初始化好,this没用的。
java final变量的初始化问题 -
lg_asus:
上面代码有点小问题,最新代码:
public class Pr ...
判断素数 -
lg_asus:
测试10 million的以内的数据,算出所有素数时间在500 ...
判断素数 -
lg_asus:
文章中说错了:如果只是找一个数在不在其中,则可以直接遍历一次, ...
40亿不重复的正整数,如何判断一个数是否在其中
原文:http://hb.qq.com/a/20101220/001541.htm
关于增强Swing您所不知道的5件事
作者: IBM 日期: 2010-12-20 文章属性:技术
【IT168 技术】用户界面设计和开发近年来有了一些改变,有人可能会说 Java 平台并不能保持。1997 年发布的 Swing 至今仍然一个标准的工具包,可以在 JVM 上构建用户界面。好的一点是,它是一个较为熟悉的标准,易于操作。不好的是,它缺乏将普通 UI 设计变丰富的特性。
在本期的 5 件事 系列 文章中,我将向您介绍 4 个免费开源组件,您可以用来现代化您的 Swing GUI,并围绕那些您可能还不可了解的 Swing 线程展开讨论。
1. Substance
将一个 Java 应用程序和一个本地操作系统整合起来是比较麻烦的,主要是因为 Swing 的组件是人工绘制的。可以改变的就是 Java 外观和效果,允许 JVM 将应用程序的组件显示委托给本地外观和效果。因此,当使用 Windows? 外观和效果时,Swing 应用程序看起来像 Windows 应用程序;当使用 Mac 外观和效果时,它们看起来 Mac 应用程序。
Swing 附带的标准、本地外观和效果,以及它自己的平台独立感觉和效果,称为 Metal。另外,Substance 是一个开源项目,Kirill Grouchnikov 开发的,提供十几种换肤外观和效果。想要尝试, 从 Java.net 下载 Substance:
将 substance.jar 文件添加到您的 CLASSPATH。
将以下系统属性添加到您应用程序的启动项:
-Dswing.defaultlaf=org.jvnet.substance.skin.lookandfeelname
在第 2 步中替换 lookandfeelname 变量,尝试下列值:
SubstanceAutumnLookAndFeel
SubstanceBusinessBlackSteelLookAndFeel
SubstanceBusinessBlueSteelLookAndFeel
SubstanceBusinessLookAndFeel
SubstanceChallengerDeepLookAndFeel
SubstanceCremeCoffeeLookAndFeel
SubstanceCremeLookAndFeel
SubstanceDustCoffeeLookAndFeel
SubstanceDustLookAndFeel
SubstanceEmeraldDuskLookAndFeel
SubstanceMagmaLookAndFeel
SubstanceMistAquaLookAndFeel
SubstanceMistSilverLookAndFeel
SubstanceModerateLookAndFeel
SubstanceNebulaBrickWallLookAndFeel
SubstanceNebulaLookAndFeel
SubstanceOfficeBlue2007LookAndFeel
SubstanceOfficeSilver2007LookAndFeel
SubstanceRavenGraphiteGlassLookAndFeel
SubstanceRavenGraphiteLookAndFeel
SubstanceRavenLookAndFeel
SubstanceSaharaLookAndFeel
SubstanceTwilightLookAndFeel
图 1 展示了一个带有默认 Metal 外观和效果的 Java 应用程序,而图 2 中的是 Substance Raven 外观和效果:
图1 Java 平台的 Metal 外观和效果
图2 Substance 的 Raven 外观和效果
2. SwingX
Swing 框架包括您需要的大部分标准控件,包括树、表、列表等等。但是它还缺少一些更为现代的控件,比如树形表。SwingX 项目(SwingLabs 的一部分)提供一个丰富的组件集,包括:
表、树和列表的分类、过滤、和突出显示
Find/search
Auto-completion
Login/authentication 框架
TreeTable 组件
Collapsible panel 组件
Date picker 组件
Tip-of-the-Day 组件
要尝试它,从 SwingLabs 下载 SwingX JAR 并将它添加到您的 CLASSPATH,或者仅将以下依赖项添加到您的 Maven POM 文件:
org.swinglabs
swingx
1.6
图 3 中的树形表是 SwingX 组件的一个示例:
图3 SwingX TreeTable 组件
构建一个 SwingX TreeTable
使用 SwingX JXTreeTable 控件,构建一个树形表是非常简单的。想象一下:您表中的每行可能有列数据,也可能有子节点。SwingX 提供一个模型类,可以扩展来提供这一功能,称为 org.jdesktop.swingx.treetable.AbstractTreeTableModel。清单 1 展示了一个树形表模型实现的示例:
清单 1. MyTreeTableModel.java
package com.geekcap.swingx.treetable;
import java.util.ArrayList;
import java.util.List;
import org.jdesktop.swingx.treetable.AbstractTreeTableModel;
public class MyTreeTableModel extends AbstractTreeTableModel
{
private MyTreeNode myroot;
public MyTreeTableModel()
{
myroot = new MyTreeNode( root, Root of the tree );
myroot.getChildren().add( new MyTreeNode( Empty Child 1,
This is an empty child ) );
MyTreeNode subtree = new MyTreeNode( Sub Tree,
This is a subtree (it has children) );
subtree.getChildren().add( new MyTreeNode( EmptyChild 1, 1,
This is an empty child of a subtree ) );
subtree.getChildren().add( new MyTreeNode( EmptyChild 1, 2,
This is an empty child of a subtree ) );
myroot.getChildren().add( subtree );
myroot.getChildren().add( new MyTreeNode( Empty Child 2,
This is an empty child ) );
}
@Override
public int getColumnCount()
{
return 3;
}
@Override
public String getColumnName( int column )
{
switch( column )
{
case 0: return Name;
case 1: return Description;
case 2: return Number Of Children;
default: return Unknown;
}
}
@Override
public Object getValueAt( Object node, int column )
{
System.out.println( getValueAt: + node + , + column );
MyTreeNode treenode = ( MyTreeNode )node;
switch( column )
{
case 0: return treenode.getName();
case 1: return treenode.getDescription();
case 2: return treenode.getChildren().size();
default: return Unknown;
}
}
@Override
public Object getChild( Object node, int index )
{
MyTreeNode treenode = ( MyTreeNode )node;
return treenode.getChildren().get( index );
}
@Override
public int getChildCount( Object parent )
{
MyTreeNode treenode = ( MyTreeNode )parent;
return treenode.getChildren().size();
}
@Override
public int getIndexOfChild( Object parent, Object child )
{
MyTreeNode treenode = ( MyTreeNode )parent;
for( int i=0; i>treenode.getChildren().size(); i++ )
{
{
return i;
}
}
return 0;
}
public boolean isLeaf( Object node )
{
MyTreeNode treenode = ( MyTreeNode )node;
{
return false;
}
return true;
}
@Override
public Object getRoot()
{
return myroot;
}
}
清单 2 显示了一个定制的树节点:
清单 2. MyTreeNode.java
class MyTreeNode
{
private String name;
private String description;
private List children = new ArrayList();
public MyTreeNode()
{
}
public MyTreeNode( String name, String description )
{
this.name = name;
this.description = description;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public List getChildren()
{
return children;
}
public String toString()
{
return MyTreeNode: + name + , + description;
}
}
如果您想使用这个树形表模型,您将需要创建一个它的实例,然后将实例传递到 JXTreeTable 构造器,像这样:
private MyTreeTableModel treeTableModel = new MyTreeTableModel();
private JXTreeTable treeTable = new JXTreeTable( treeTableModel );
现在,您可以将 treeTable 添加到任何 Swing 容器,比如 JPanel 或者 JFrame 的内容面板。
3. RSyntaxTextArea
Swing 所缺少的另一个组件是一个带有语法高亮显示功能的文本编辑器。如果您编写了一个 XML 文档,那么就会知道它对于直观区别标记、属性、属性值和标记值是多么的有帮助。FifeSoft 的开发人员已经构建了一组丰富的组件,您可以在基于 Swing 的 Java 应用程序中使用它们,其中之一是 RSyntaxTextArea 组件。
RSyntaxTextArea 支持大多数开箱即用的编程语言,包括 C、C++、Perl、PHP、以及 Java,还有 HTML、JavaScript、XML、甚至 SQL。
图 4 是一个 RSyntaxTextArea组件的屏幕截图,显示了一个 XML 文件:
图4 RSyntaxTextArea 显示一个 XML 文件
将语法高亮显示添加到 Swing 应用程序
首先,从 Sourceforge 下载 RSyntaxTextArea JAR 文件。如果您正在使用 Maven,您可能想将它安装到您的本地库中,使用像这样一个命令:
mvn install:install-file -DgroupId=com.fifesoft -DartifactId=rsyntaxtextarea
-Dversion=1.0 -Dpackaging=jar -Dfile=/path/to/file
当您将 JAR 文件添加到您的项目之后,您就可以开始在您的应用程序中创建一个 RSyntaxTextArea 实例了,并且如果您想要滚动功能,就将它添加到 RTestScrollPane 中,然后调用 setSyntaxEditingStyle() 方法,为它传递一个 SyntaxConstants。例如,清单 3 创建了一个可滚动的 RSyntaxTextArea,以 XML 形式呈现文本:
清单 3. 在 Swing 中语法高亮显示
RSyntaxTextArea text = new RSyntaxTextArea();
add( new RTextScrollPane( text ) );
text.setSyntaxEditingStyle( SyntaxConstants.SYNTAX_STYLE_XML );
4. Java Look-and-Feel Graphics Repository
Microsoft 做得比较好的一点是确保 Windows 应用程序有一个一致的外观和效果。如果您在很久之前就已经在编写 Java Swing 应用程序了,您可能会遇到 Oracle 的 Java Look-and-Feel Graphics Repository。如果没有,那您是比较幸运的。Java Look-and-Feel Graphics Repository 含有一个系列标准应用程序行为图标,比如 File->New 和 Edit->Copy,以及比较深奥的命令,比如媒体控制、浏览器导航功能、Java 开发人员的编程图标。图 5 展示了一个从 Oracle 网站抓取的图标:
图5 Java Look-And-Feel Graphics Repository 图标
如果 Java Look-And-Feel Graphics Repository 只提供预构建图形,那就太好了,但是它还提供标准约定,您构建或命名菜单、工具栏,以及快捷键时都要使用这些约定。比如,复制功能应该使用快捷键 Ctrl-C(称为 Copy)实现,而且提供了一个 Copy 工具提示。当在菜单中时,复制函数的助记符应该是 C、P、或者至少应该是 Y。
使用 Java Look-And-Feel Graphics Repository 图标
要试用 图 5 中显示的一些预构建图形,从 Oracle 中 下载 Java Look-and-Feel Graphics Repository JAR,并添加到您的 CLASSPATH。然后,您需要从 JAR 文件内将图标作为资源加载:图标是以下格式的:
...
toolbarButtonGraphics/general/Copy16.gif
toolbarButtonGraphics/general/Copy24.gif
toolbarButtonGraphics/general/Cut16.gif
toolbarButtonGraphics/general/Cut24.gif
toolbarButtonGraphics/general/Delete16.gif
toolbarButtonGraphics/general/Delete24.gif
...
所有图标都包含在 toolbarButtonGraphics 目录下,分成两类在 图 5 中显示。在这种情况下,我们将考虑从总类中复制、剪切、粘贴和删除。名称中的 “16” 和 “24” 反映了图标的大小:16x16 或 24x24。您可以创建一个 ImageIcon 图标添加到文件中,例如:
Class>String urlString = /toolbarButtonGraphics/general/Cut16.gif
URL url = class.getResource( urlString );
ImageIcon icon = new ImageIcon( url );
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.border=1 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 平台上构建丰富的用户界面比较容易。
关于增强Swing您所不知道的5件事
作者: IBM 日期: 2010-12-20 文章属性:技术
【IT168 技术】用户界面设计和开发近年来有了一些改变,有人可能会说 Java 平台并不能保持。1997 年发布的 Swing 至今仍然一个标准的工具包,可以在 JVM 上构建用户界面。好的一点是,它是一个较为熟悉的标准,易于操作。不好的是,它缺乏将普通 UI 设计变丰富的特性。
在本期的 5 件事 系列 文章中,我将向您介绍 4 个免费开源组件,您可以用来现代化您的 Swing GUI,并围绕那些您可能还不可了解的 Swing 线程展开讨论。
1. Substance
将一个 Java 应用程序和一个本地操作系统整合起来是比较麻烦的,主要是因为 Swing 的组件是人工绘制的。可以改变的就是 Java 外观和效果,允许 JVM 将应用程序的组件显示委托给本地外观和效果。因此,当使用 Windows? 外观和效果时,Swing 应用程序看起来像 Windows 应用程序;当使用 Mac 外观和效果时,它们看起来 Mac 应用程序。
Swing 附带的标准、本地外观和效果,以及它自己的平台独立感觉和效果,称为 Metal。另外,Substance 是一个开源项目,Kirill Grouchnikov 开发的,提供十几种换肤外观和效果。想要尝试, 从 Java.net 下载 Substance:
将 substance.jar 文件添加到您的 CLASSPATH。
将以下系统属性添加到您应用程序的启动项:
-Dswing.defaultlaf=org.jvnet.substance.skin.lookandfeelname
在第 2 步中替换 lookandfeelname 变量,尝试下列值:
SubstanceAutumnLookAndFeel
SubstanceBusinessBlackSteelLookAndFeel
SubstanceBusinessBlueSteelLookAndFeel
SubstanceBusinessLookAndFeel
SubstanceChallengerDeepLookAndFeel
SubstanceCremeCoffeeLookAndFeel
SubstanceCremeLookAndFeel
SubstanceDustCoffeeLookAndFeel
SubstanceDustLookAndFeel
SubstanceEmeraldDuskLookAndFeel
SubstanceMagmaLookAndFeel
SubstanceMistAquaLookAndFeel
SubstanceMistSilverLookAndFeel
SubstanceModerateLookAndFeel
SubstanceNebulaBrickWallLookAndFeel
SubstanceNebulaLookAndFeel
SubstanceOfficeBlue2007LookAndFeel
SubstanceOfficeSilver2007LookAndFeel
SubstanceRavenGraphiteGlassLookAndFeel
SubstanceRavenGraphiteLookAndFeel
SubstanceRavenLookAndFeel
SubstanceSaharaLookAndFeel
SubstanceTwilightLookAndFeel
图 1 展示了一个带有默认 Metal 外观和效果的 Java 应用程序,而图 2 中的是 Substance Raven 外观和效果:
图1 Java 平台的 Metal 外观和效果
图2 Substance 的 Raven 外观和效果
2. SwingX
Swing 框架包括您需要的大部分标准控件,包括树、表、列表等等。但是它还缺少一些更为现代的控件,比如树形表。SwingX 项目(SwingLabs 的一部分)提供一个丰富的组件集,包括:
表、树和列表的分类、过滤、和突出显示
Find/search
Auto-completion
Login/authentication 框架
TreeTable 组件
Collapsible panel 组件
Date picker 组件
Tip-of-the-Day 组件
要尝试它,从 SwingLabs 下载 SwingX JAR 并将它添加到您的 CLASSPATH,或者仅将以下依赖项添加到您的 Maven POM 文件:
org.swinglabs
swingx
1.6
图 3 中的树形表是 SwingX 组件的一个示例:
图3 SwingX TreeTable 组件
构建一个 SwingX TreeTable
使用 SwingX JXTreeTable 控件,构建一个树形表是非常简单的。想象一下:您表中的每行可能有列数据,也可能有子节点。SwingX 提供一个模型类,可以扩展来提供这一功能,称为 org.jdesktop.swingx.treetable.AbstractTreeTableModel。清单 1 展示了一个树形表模型实现的示例:
清单 1. MyTreeTableModel.java
package com.geekcap.swingx.treetable;
import java.util.ArrayList;
import java.util.List;
import org.jdesktop.swingx.treetable.AbstractTreeTableModel;
public class MyTreeTableModel extends AbstractTreeTableModel
{
private MyTreeNode myroot;
public MyTreeTableModel()
{
myroot = new MyTreeNode( root, Root of the tree );
myroot.getChildren().add( new MyTreeNode( Empty Child 1,
This is an empty child ) );
MyTreeNode subtree = new MyTreeNode( Sub Tree,
This is a subtree (it has children) );
subtree.getChildren().add( new MyTreeNode( EmptyChild 1, 1,
This is an empty child of a subtree ) );
subtree.getChildren().add( new MyTreeNode( EmptyChild 1, 2,
This is an empty child of a subtree ) );
myroot.getChildren().add( subtree );
myroot.getChildren().add( new MyTreeNode( Empty Child 2,
This is an empty child ) );
}
@Override
public int getColumnCount()
{
return 3;
}
@Override
public String getColumnName( int column )
{
switch( column )
{
case 0: return Name;
case 1: return Description;
case 2: return Number Of Children;
default: return Unknown;
}
}
@Override
public Object getValueAt( Object node, int column )
{
System.out.println( getValueAt: + node + , + column );
MyTreeNode treenode = ( MyTreeNode )node;
switch( column )
{
case 0: return treenode.getName();
case 1: return treenode.getDescription();
case 2: return treenode.getChildren().size();
default: return Unknown;
}
}
@Override
public Object getChild( Object node, int index )
{
MyTreeNode treenode = ( MyTreeNode )node;
return treenode.getChildren().get( index );
}
@Override
public int getChildCount( Object parent )
{
MyTreeNode treenode = ( MyTreeNode )parent;
return treenode.getChildren().size();
}
@Override
public int getIndexOfChild( Object parent, Object child )
{
MyTreeNode treenode = ( MyTreeNode )parent;
for( int i=0; i>treenode.getChildren().size(); i++ )
{
{
return i;
}
}
return 0;
}
public boolean isLeaf( Object node )
{
MyTreeNode treenode = ( MyTreeNode )node;
{
return false;
}
return true;
}
@Override
public Object getRoot()
{
return myroot;
}
}
清单 2 显示了一个定制的树节点:
清单 2. MyTreeNode.java
class MyTreeNode
{
private String name;
private String description;
private List children = new ArrayList();
public MyTreeNode()
{
}
public MyTreeNode( String name, String description )
{
this.name = name;
this.description = description;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public List getChildren()
{
return children;
}
public String toString()
{
return MyTreeNode: + name + , + description;
}
}
如果您想使用这个树形表模型,您将需要创建一个它的实例,然后将实例传递到 JXTreeTable 构造器,像这样:
private MyTreeTableModel treeTableModel = new MyTreeTableModel();
private JXTreeTable treeTable = new JXTreeTable( treeTableModel );
现在,您可以将 treeTable 添加到任何 Swing 容器,比如 JPanel 或者 JFrame 的内容面板。
3. RSyntaxTextArea
Swing 所缺少的另一个组件是一个带有语法高亮显示功能的文本编辑器。如果您编写了一个 XML 文档,那么就会知道它对于直观区别标记、属性、属性值和标记值是多么的有帮助。FifeSoft 的开发人员已经构建了一组丰富的组件,您可以在基于 Swing 的 Java 应用程序中使用它们,其中之一是 RSyntaxTextArea 组件。
RSyntaxTextArea 支持大多数开箱即用的编程语言,包括 C、C++、Perl、PHP、以及 Java,还有 HTML、JavaScript、XML、甚至 SQL。
图 4 是一个 RSyntaxTextArea组件的屏幕截图,显示了一个 XML 文件:
图4 RSyntaxTextArea 显示一个 XML 文件
将语法高亮显示添加到 Swing 应用程序
首先,从 Sourceforge 下载 RSyntaxTextArea JAR 文件。如果您正在使用 Maven,您可能想将它安装到您的本地库中,使用像这样一个命令:
mvn install:install-file -DgroupId=com.fifesoft -DartifactId=rsyntaxtextarea
-Dversion=1.0 -Dpackaging=jar -Dfile=/path/to/file
当您将 JAR 文件添加到您的项目之后,您就可以开始在您的应用程序中创建一个 RSyntaxTextArea 实例了,并且如果您想要滚动功能,就将它添加到 RTestScrollPane 中,然后调用 setSyntaxEditingStyle() 方法,为它传递一个 SyntaxConstants。例如,清单 3 创建了一个可滚动的 RSyntaxTextArea,以 XML 形式呈现文本:
清单 3. 在 Swing 中语法高亮显示
RSyntaxTextArea text = new RSyntaxTextArea();
add( new RTextScrollPane( text ) );
text.setSyntaxEditingStyle( SyntaxConstants.SYNTAX_STYLE_XML );
4. Java Look-and-Feel Graphics Repository
Microsoft 做得比较好的一点是确保 Windows 应用程序有一个一致的外观和效果。如果您在很久之前就已经在编写 Java Swing 应用程序了,您可能会遇到 Oracle 的 Java Look-and-Feel Graphics Repository。如果没有,那您是比较幸运的。Java Look-and-Feel Graphics Repository 含有一个系列标准应用程序行为图标,比如 File->New 和 Edit->Copy,以及比较深奥的命令,比如媒体控制、浏览器导航功能、Java 开发人员的编程图标。图 5 展示了一个从 Oracle 网站抓取的图标:
图5 Java Look-And-Feel Graphics Repository 图标
如果 Java Look-And-Feel Graphics Repository 只提供预构建图形,那就太好了,但是它还提供标准约定,您构建或命名菜单、工具栏,以及快捷键时都要使用这些约定。比如,复制功能应该使用快捷键 Ctrl-C(称为 Copy)实现,而且提供了一个 Copy 工具提示。当在菜单中时,复制函数的助记符应该是 C、P、或者至少应该是 Y。
使用 Java Look-And-Feel Graphics Repository 图标
要试用 图 5 中显示的一些预构建图形,从 Oracle 中 下载 Java Look-and-Feel Graphics Repository JAR,并添加到您的 CLASSPATH。然后,您需要从 JAR 文件内将图标作为资源加载:图标是以下格式的:
...
toolbarButtonGraphics/general/Copy16.gif
toolbarButtonGraphics/general/Copy24.gif
toolbarButtonGraphics/general/Cut16.gif
toolbarButtonGraphics/general/Cut24.gif
toolbarButtonGraphics/general/Delete16.gif
toolbarButtonGraphics/general/Delete24.gif
...
所有图标都包含在 toolbarButtonGraphics 目录下,分成两类在 图 5 中显示。在这种情况下,我们将考虑从总类中复制、剪切、粘贴和删除。名称中的 “16” 和 “24” 反映了图标的大小:16x16 或 24x24。您可以创建一个 ImageIcon 图标添加到文件中,例如:
Class>String urlString = /toolbarButtonGraphics/general/Cut16.gif
URL url = class.getResource( urlString );
ImageIcon icon = new ImageIcon( url );
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.border=1 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 平台上构建丰富的用户界面比较容易。
发表评论
-
swt tree demo with a text editor
2012-12-25 16:41 1539项目需要,从XML中读取数据生成一个Tree,然后可以对叶子节 ... -
Paint in AWT andSwing
2012-04-20 21:32 0jdk 1.0中用的是AWT,有一个缺点,就是每个组件要和一个 ... -
SwingUtilities的invokeLater和invokeAndWait
2012-02-28 18:00 1165参考: http://blog.csdn.net/bzwm/a ... -
swing 日期组件
2012-02-03 15:35 1156/** * chega * 2011-9-21上午 ... -
java swing全屏显示方式
2012-02-01 11:01 5127覆盖任务栏和不覆盖任务栏见:http://blog.csdn. ... -
带有行标题的JTable
2012-01-06 15:59 1238/** * @author chega * thi ... -
JColorChooser
2010-07-18 21:25 1175import java.awt.*; import ja ... -
JFileChooser
2010-07-18 20:17 1224import java.awt.*; import ja ... -
AbstractAction
2010-07-18 10:00 1829import java.awt.*; import ja ... -
JMenuItem和JTollBar
2010-07-18 09:34 1537import java.awt.*; import ja ... -
JTree
2010-07-17 16:41 1207import java.awt.*; import ja ... -
JTree
2010-07-17 14:58 1031import java.awt.*; import ja ... -
JTree
2010-07-17 13:17 1073import java.awt.*; import ja ... -
UndoableEditListener 和 DocumentListener
2010-07-15 21:24 1351import java.awt.*; import ja ... -
JTable增刪行列
2010-07-14 19:57 1453import java.awt.*; import ja ... -
JTable背景色與Boolean類型數據顯示衝突的問題
2010-07-12 16:53 944import java.awt.*; import java ... -
JComboBox每個Item加圖標
2010-07-11 16:46 1289import java.awt.*; import java ... -
JComboBox
2010-07-11 16:33 1308JComboBox(ComboModel):可以繼承Abstr ... -
JList雙向列表
2010-07-11 15:43 811import java.awt.*; import java ... -
給JList每個Item加個圖標
2010-07-11 14:40 1406import java.awt.*; import ja ...
相关推荐
在处理日期和时间选择时,Swing虽然没有内置的日期选择器,但可以通过第三方库来实现,例如"JDateField.jar"就是这样一个专门用于日期输入的控件。 "JDateField.jar"是一个第三方库,它提供了日期选择的功能,使得...
上传的压缩包中可能包含了这些第三方LookAndFeel的jar文件,它们可能是实现特定皮肤效果的关键。开发者通常通过导入这些jar文件到项目中,然后调用相应的类和方法来改变Swing组件的外观。例如,Substance库就提供了...
9. **异常处理**:在使用第三方库时,务必考虑异常处理,确保程序在遇到问题时能够优雅地处理错误。 通过以上步骤,开发者可以在Java Swing应用中集成这个日历插件,提供一个用户友好的日期和时间选择功能。`...
为了解决这个问题,开发人员通常会寻找第三方库来美化 Swing 应用程序的界面,让它们看起来更加现代和专业。 "Java Swing 界面美化包-含源码" 就是这样一种解决方案,它专门用于提升 Swing 应用程序的外观。这个包...
在Java编程中,为了增强应用程序的用户界面和交互体验,我们常常会引入第三方控件。这些控件不仅可以提供丰富的视觉效果,还能增加功能,让Java桌面应用看起来更加专业和现代化。"java第三方控件和代码"这个主题主要...
通过这个例子,开发者不仅可以学习如何使用 Substance,还可以了解到如何将第三方库集成到自己的项目中,以及如何通过调整 UI 配置来优化用户体验。 在实际开发中,Substance 可以帮助提升 Java 桌面应用的视觉吸引...
虽然SwingX本身并不直接包含OCR功能,但其JXImagePane组件可能用作显示和预处理图像的工具,而真正的OCR处理可能依赖于其他第三方库,如Apache Tika或Google的Tesseract OCR。 在实际应用中,开发者可以利用SwingX...
总之,通过引入如Weblaf这样的第三方库,开发者可以轻松地将Swing应用的界面从传统的默认样式转变为更具吸引力和现代感的外观,从而提升应用的整体用户体验。在实际开发过程中,灵活运用这些工具能够显著改善Swing...
在这种情况下,第三方库如JDatePicker应运而生,它为Java Swing提供了一个高度可定制且功能丰富的日期选择框架。 JDatePicker是一款基于Java Swing的日期选择器,版本1.3.4是一个稳定且广泛使用的版本。它旨在增强...
在Java Swing中,没有内置的日期选择器,但开发者通常会使用第三方库或者自定义组件来实现这一功能。本资源就是关于一个重写过的Java Swing日期控件,修复了之前版本缺少jar包的问题。 `DatePicker` 和 `DateField`...
Swing显示HTML网页是Java开发GUI应用程序时的一个常见需求,主要涉及到Java的Swing库以及相关的第三方库,如JDIC(Java Desktop Integration Components)。本文将详细介绍如何在Swing界面中集成HTML网页显示功能。 ...
然而,通过引入第三方库,如DJ Native Swing,我们可以实现在Swing应用中嵌入HTML的功能,这对于创建复杂的用户界面或者展示富文本信息非常有用。本实例面向Java新手,将详细讲解如何使用DJ Native Swing库在Java ...
`twaver.jar` 文件是一个第三方库,可能包含了用于数据可视化或图表展示的功能。Twaver 是一个强大的Java图表和网络图库,支持创建各种复杂的图表,如流程图、组织结构图、拓扑图等,可以很好地与SWING集成,增强...
为了提升用户体验和视觉吸引力,开发人员可以使用第三方库来改变Swing应用程序的皮肤,其中"Substance"就是一种广受欢迎的皮肤库。 Substance库为Swing应用提供了多种独特的视觉主题,这些主题不仅改变了控件的外观...
2. **解析HTML**:可能使用`javax.swing.text.html.parser.DocumentParser`或第三方库如Jsoup解析HTML,获取页面布局和内容。 3. **渲染网页**:使用DJNativeSwing提供的功能,如`...
3. **第三方库的使用** 许多开源项目提供了专门用于Java界面美化的jar包,例如JIDE Common、 Substance、JFreeChart等。JIDE Common提供了一系列增强版的Swing组件,Substance库则提供了大量预设的主题,JFreeChart...
为了改变这种情况,一些第三方库如JTattoo应运而生。 JTattoo是一个开源的外观和感觉(Look and Feel)库,专门设计用来增强Swing组件的视觉效果。它为Java开发者提供了多种皮肤,可以轻松地将Swing应用的外观改造成...
JCalendar是一个非标准的Swing组件,它由第三方库提供,如be.jar或jcalendar.jar。这个组件提供了一个完整的日历视图,用户可以通过点击不同的日期单元格来选择日期。JCalendar通常会附带一个日期选择器对话框,用户...
在Java开发中,使用第三方库可以显著提高开发效率,因为它们通常已经实现了许多常用功能,开发者无需从零开始编写代码。 为了有效地使用这些JAR包,开发者需要了解以下几点: 1. **引入JAR包**:将JAR包添加到项目...
在描述中提到的"swing的日历插件",可能指的是第三方库提供的扩展,因为Swing的标准库内并没有内置的DatePicker组件。这些插件通常包含易于使用的API,可以帮助开发者快速集成到他们的应用程序中。 这个"datepicker...