`

LAF让Java Swing漂亮起来

阅读更多

       上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下Java Swing 中的LAF。其实很多朋友觉得Swing很丑,那是因为他们还没有真正认识到Swing,要想让Swing漂亮起来就必须熟练掌握LAF (全称:LookAndFeel)。可能很多新接触的朋友对LAF很抽象,这里简单说,LAF的功能有点像网页中的CSS,LAF可以定制Swing app的风格。

     这里还是老规矩,先上官网:http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/index.html 

     其实JDK已经自带了几种LAF, 看看下面的例子,如何正确使用JDK自带的LAF。

package org.dui.laf;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Enumeration;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

/**
 * <code>LAFDemo01</code>
 * 
 * @author Jimmy(SZ)
 * 
 * @since <i>v1.0.0 (Apr 11,2013)</i>
 */
public class LAFDemo01 extends JPanel {
	private static final long serialVersionUID = 1L;
	private JComboBox m_oCmb;

	/**
	 * Create an instance
	 */
	public LAFDemo01() {
		initGUI();
		initEventHandler();
		initDataBindings();
	}

	/**
	 * Initial the ui
	 * 
	 * @since <i>v1.0.0 (Apr 11,2013)</i>
	 */
	public void initGUI() {
		this.setLayout(new GridLayout(7, 2));
		m_oCmb = new JComboBox();
		this.add(new JLabel("在这里选择你喜欢的LAF:"));
		this.add(m_oCmb);
		this.add(new JLabel("Button : "));
		this.add(new JButton("Button"));
		this.add(new JLabel("TextField : "));
		this.add(new JTextField(""));
		this.add(new JLabel("CheckBox : "));
		this.add(new JCheckBox("CheckBox"));
		this.add(new JLabel("RadioButton : "));
		this.add(new JRadioButton("RadioButton"));
		this.add(new JLabel("ComboBox : "));
		this.add(new JComboBox(new String[] { "ComboBox" }));
	}

	/**
	 * Binding the event
	 * 
	 * @since <i>v1.0.0 (Apr 11,2013)</i>
	 */
	public void initEventHandler() {
		m_oCmb.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				try {
					UIManager.setLookAndFeel(((DataType) e.getItem()).getVal());
				} catch (Exception e1) {
					e1.printStackTrace();
				}
				SwingUtilities.updateComponentTreeUI(LAFDemo01.this);
			}
		});
	}

	public void initDataBindings() {
		LookAndFeelInfo[] aInfo = UIManager.getInstalledLookAndFeels();
		for (LookAndFeelInfo oInfo : aInfo) {
			DataType oType = new DataType(oInfo.getName(), oInfo.getClassName());
			m_oCmb.addItem(oType);
		}
	}

	class DataType {
		String m_sCode;
		String m_sVal;

		public DataType(String sCode, String sVal) {
			m_sCode = sCode;
			m_sVal = sVal;
		}

		public String getVal() {
			return m_sVal;
		}

		public String toString() {
			return m_sCode;
		}
	}
	/**
	 * Launch the app
	 * 
	 * @param args
	 * @since <i>v1.0.0 (Apr 11 ,2013)</i>
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				JFrame oFrame = new JFrame();
				oFrame.setContentPane(new LAFDemo01());
				oFrame.setTitle("LAFDemo01");
				oFrame.setSize(400, 400);
				oFrame.setLocationRelativeTo(null);
				oFrame.setVisible(true);
			}
		});
	}
}

 

 好,看到这里,大家就觉得LAF真的那么简单吗,仅仅UIManager.setLookAndFeel(XXX)就搞定。不错,LAF就是这么简单。不过提醒一下,如果运行时改变LAF,要加上SwingUtilities.updateComponentTreeUI(LAFDemo01.this);,这个功能相当于“刷新界面”。来到这里也许大家会有一个问题,如何改变某种LAF里面的Widget的风格呢,比如前景色、背景色等等。这里拿JButton做例子,还没有接触Swing LAF以前,我们会用Button.setForeground(Color),Button.setBackground(Color),但是大家想想,如果一个大型的APP,里面有N多个Button,那岂不是要花很多时间。有了LAF以后我们就方便多了,全部美化的工作都是交给LAF去做。下面修改一下上面的例子:

在LAFDemo01中加入

 

	static{
		UIManager.put("Button.foreground", new Color(255, 0 , 0));
		UIManager.put("Button.font", new Font("宋体", Font.BOLD , 32) );
		UIManager.put("Button.background", new Color(0, 255 , 255));
	}

Button的字体、前景色和背景色都发生了变化:前后两张图的对比



 
 是不是觉得很简单呢?在LAF中我们可以通过key-value的方式来定制自己喜欢的风格。这里,大家会问,那怎么知道LAF的所有的Key呢, 大家可以Google一下,这里提供Nimbus的Keys :http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html  。这里提供一个查找当前LAF 的所有的Keys 类(PS:网路上的):

import java.util.Enumeration;

import javax.swing.UIDefaults;
import javax.swing.UIManager;

public class ListProperties {
	@SuppressWarnings({ "rawtypes", "unused" })
	public static void main(String args[]) throws Exception {
		UIManager.LookAndFeelInfo looks[] = UIManager.getInstalledLookAndFeels();
		UIDefaults defaults = UIManager.getDefaults();
		Enumeration newKeys = defaults.keys();
		while (newKeys.hasMoreElements()) {
			Object obj = newKeys.nextElement();
			if (obj.toString().startsWith("FormattedTextField"))
				System.out.printf("%50s : %s\n", obj, UIManager.get(obj));
		}
	}
}

   如果有的朋友想直接用第三方的LAF,这里介绍给大家 subtance、WebLookAndFeel,请看附件中!这两个LAF很好看,也好用。 今天LAF就介绍到这里,不懂的朋友,加油.眨眼

    最后上一张WebLookAndFeel的图片:



 

  • 大小: 29.8 KB
  • 大小: 352.6 KB
  • 大小: 113.7 KB
6
0
分享到:
评论
18 楼 dwangel 2013-04-13  
JimmyHR 写道
dwangel 写道
其实,swing还有一个问题就是 layoutManager 确实比较弱。
作为 java ide成功者 intellij,就自己实现了一个GridLayout,自己用。
会方便很多。

我是没能力自己建一个LayoutManager。
不知道有没有啥好的开源。

我前面有文章介绍了两个比较好的开源的LayoutManager:TableLayout、MigLayout,特别是MigLayout特别好使。http://jimmyhr.iteye.com/admin/categories/271993

thank you
17 楼 JimmyHR 2013-04-13  
dwangel 写道
其实,swing还有一个问题就是 layoutManager 确实比较弱。
作为 java ide成功者 intellij,就自己实现了一个GridLayout,自己用。
会方便很多。

我是没能力自己建一个LayoutManager。
不知道有没有啥好的开源。

我前面有文章介绍了两个比较好的开源的LayoutManager:TableLayout、MigLayout,特别是MigLayout特别好使。http://jimmyhr.iteye.com/admin/categories/271993
16 楼 dwangel 2013-04-13  
其实,swing还有一个问题就是 layoutManager 确实比较弱。
作为 java ide成功者 intellij,就自己实现了一个GridLayout,自己用。
会方便很多。

我是没能力自己建一个LayoutManager。
不知道有没有啥好的开源。
15 楼 JimmyHR 2013-04-13  
freezingsky 写道
功能实现,先不做讨论。至于外观的美丽与否,就要看各自的水平和能力了,与所用的语言和平台没有什么关系

恩,所以说在很多人眼里“丑陋”的Swing,其实并不“丑陋”,至少JIDE的Swing产品做得很成功。
14 楼 JimmyHR 2013-04-13  
PetriNet 写道
java对debug毫无压力,没用过js的人还好意思嘲笑debug难

这位仁兄说得对,java的debug没问题,只要我们注意一些细节的问题。
13 楼 PetriNet 2013-04-13  
java对debug毫无压力,没用过js的人还好意思嘲笑debug难
12 楼 freezingsky 2013-04-12  
功能实现,先不做讨论。至于外观的美丽与否,就要看各自的水平和能力了,与所用的语言和平台没有什么关系
11 楼 JimmyHR 2013-04-12  
mayufenga1 写道
还是难看啊

对的,例子只是简简单单介绍如何利用swing LAF来改变Style,不做过多的美化,如果要用Swing LAF来实现CSS的那一套东西,不是没有可能,至少我这里已经实现了,而且在下面的评论的回复中我也说了,自己来加入一些渐变、特效等等才能漂亮起来。
10 楼 mayufenga1 2013-04-12  
还是难看啊
9 楼 JimmyHR 2013-04-12  
zhao173123 写道
JimmyHR 写道
hbbbs 写道
哈,还是不够漂亮

对是的,不过要想漂亮的话,还是要自己来实现的,自己来加入一些渐变、特效等等。这里只是简单提供介绍一下LAF,LAF能够胜任Swing美化的工作。公司的产品都是用LAF来完成产品的美化,如下图(截一小段图):


请教下,你的折线图是用什么做的。
我用JFreeChart做的图如下:

感觉很丑啊,怎么做渐变和特效呢。


对于,折线图怎么做,很难说,这里不是几句话就能说完的,因为公司有一套专门做这个的东西,不过我可以很简单告诉你,Java2D要非常熟练。关于渐变的可以查阅JDK-API java.awt.Paint下的几个子类 MultipleGradientPaint、 LinearGradientPaint等等,关于一些特效的话,你可以看看JIDE,这里给个网址http://www.jidesoft.com/  ,在以后还会有一些文章介绍LAF。
8 楼 JimmyHR 2013-04-12  
zhao173123 写道
看了看,习惯了简单朴素了。
花哨的不适合。
Swing真不是好东西,不利于调试就不建议大家学了;工作用到没办法。

青菜萝卜各有所爱,Swing的调试并不是很难,如果你的程序大部分设计到多线程,那么前提是对UI的操作请在EDT下进行,如果不在EDT下操作,还真不容易调试。其实Swing这东西是好的,就看怎么用。
7 楼 zhao173123 2013-04-12  
看了看,习惯了简单朴素了。
花哨的不适合。
Swing真不是好东西,不利于调试就不建议大家学了;工作用到没办法。
6 楼 zhao173123 2013-04-12  
5 楼 zhao173123 2013-04-12  
晕。不会贴图。
4 楼 zhao173123 2013-04-12  
JimmyHR 写道
hbbbs 写道
哈,还是不够漂亮

对是的,不过要想漂亮的话,还是要自己来实现的,自己来加入一些渐变、特效等等。这里只是简单提供介绍一下LAF,LAF能够胜任Swing美化的工作。公司的产品都是用LAF来完成产品的美化,如下图(截一小段图):


请教下,你的折线图是用什么做的。
我用JFreeChart做的图如下:

感觉很丑啊,怎么做渐变和特效呢。
3 楼 JimmyHR 2013-04-12  
hbbbs 写道
哈,还是不够漂亮

对是的,不过要想漂亮的话,还是要自己来实现的,自己来加入一些渐变、特效等等。这里只是简单提供介绍一下LAF,LAF能够胜任Swing美化的工作。公司的产品都是用LAF来完成产品的美化,如下图(截一小段图):
2 楼 hbbbs 2013-04-11  
哈,还是不够漂亮
1 楼 hanwangkun 2013-04-11  

相关推荐

    LAF让Swing漂亮起来03 (模拟闪烁的股票行情系統)

    在本文中,我们将深入探讨如何使用Look and Feel(LAF)技术使Swing应用程序看起来更加美观,特别是通过创建一个模拟闪烁的股票行情系统。Swing是Java中的一个GUI工具包,虽然功能强大,但默认的界面风格可能并不...

    substance7.1(全) Swing LAF

    然而,Swing的默认LAF可能在视觉效果上显得较为单调,这就是Substance LAF的价值所在——它提供了多样的主题和高度可定制的外观,使Java应用看起来更加现代和专业。 在使用Substance LAF时,开发者可以轻松地切换...

    java swing Mac风格的LookAndFeel

    LookAndFeel提供了跨平台的能力,让Java应用可以在不同操作系统上呈现出与本地系统相匹配的界面。Java Swing内置了几种预定义的LookAndFeel,包括Metal(默认的Java LookAndFeel)、Windows以及Motif。然而,对于在...

    java swing里支持,js,java编程语言,关键字高亮显示

    Java Swing 是 Java GUI(图形用户界面)开发的一个重要库,它是Java AWT(Abstract Window Toolkit)的扩展,提供了更丰富的组件和更现代化的外观。在Java Swing中,开发者可以创建功能丰富的桌面应用,并且Swing...

    The Java Swing tutorial.pdf

    Java Swing 是一套用于创建图形用户界面(GUI)的工具包,由Sun Microsystems(现为Oracle Corporation的一部分)发布。它作为Java基础类(Java Foundation Classes,简称JFC)的一部分,为开发跨平台的桌面应用程序...

    java中awt和swing是的关系以及区别

    - **自定义外观**:Swing组件支持可替换的外观和感觉(look and feel),可以通过改变LAF来使应用程序看起来像不同的操作系统环境。 - **事件处理**:Swing也采用了一种基于监听器的事件处理机制,但其API设计更为...

    Swing样式大全 主题 皮肤包(全56种经典)LookAndFeel

    Swing样式大全 主题 皮肤包(全56种经典)LookAndFeel 本样式合集共有56种样式,包括使用说明和实例,即装即用 5种经典的Alloy和liquidlnf包 7种另类风格和实例包 20种样式风格包 24种样式合集包

    JFrame边框阴影效果,窗口透明,组件不透明

    在Java GUI编程中,`...通过`setOpacity()`设置透明度,结合自定义边框类如`ShadowBorder`,我们可以让`JFrame`看起来更加美观和专业。在实际应用中,一定要注意兼容性问题,并根据需求调整透明度和阴影效果的细节。

    javase swing界面的风格包,mac版本

    使用这个风格包,开发者可以让Java应用在Mac环境下看起来更加原生,提升用户体验。 要使用这个Mac版本的Swing风格包,开发者需要进行以下步骤: 1. 导入必要的库:首先,需要将压缩包中的.jar文件添加到项目的类...

    java 皮肤 苹果风格 超漂亮

    Java 皮肤,特别是苹果风格的皮肤,为Java应用程序带来了独特的视觉体验,使用户界面看起来更加美观、时尚。这种设计灵感来源于苹果公司的操作系统,如macOS,以其简洁、优雅的界面而闻名。Java 皮肤通常通过Java ...

    在跨平台Java Swing应用程序中设置Mac菜单栏和Dock

    Java Swing 是一个用于构建桌面应用的Java库,它允许开发者创建功能丰富的图形用户界面(GUI)。Swing 提供了跨平台的兼容性,意味着你可以在不同的操作系统上运行同一个程序,包括Mac OS。在Mac上,有两个关键的...

    界面 SwingSet + GenLAF (version 1).rar

    SwingSet + GenLAF (version 1) 是一个基于Java Swing库的用户界面示例集合,配合GenLAF(Generic Look and Feel)库,用于展示不同外观和感觉(LookAndFeel)的效果。在Java编程中,Swing是用于构建图形用户界面...

    darklaf:Darklaf-基于Darcula-Laf的主题化Swing外观

    LaF与Java&gt; = 1.8兼容(您需要&gt; = 1.9才能获得适当的缩放比例)。 您可以在weisj.github.io/darklaf-docs上找到所有属性值 该项目在Maven Central上可用: 玛文 &lt; groupId&gt;com.github.weisj&lt;/ groupId&gt; ...

    swing窗体外观皮肤

    通过引入nimrodlf-1.0e.jar文件,我们可以将Swing的默认LookAndFeel替换为NimrodLF提供的各种主题,从而让应用程序看起来更加专业和现代化。 首先,你需要将nimrodlf-1.0e.jar添加到你的项目类路径中。这可以通过...

    swing 小案例

    Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分,由Sun Microsystems开发并随Java 1.2版本发布。Swing提供了丰富的组件库,用于创建桌面应用程序,包括按钮、...

    Java Swing组件定制CheckBox示例

    在Java Swing中,CheckBox是一种常用的用户界面元素,用于表示两种可能状态之一的选择:选中或未选中。Swing提供了一种高度可定制的方式,允许开发者根据需求改变CheckBox的外观和行为。本示例将详细介绍如何自定义...

    Swing外观 Swing Applet 外观

    - **方法二**:在命令行启动Java应用时,通过`-Dswing.laf`属性指定外观,如`java -Dswing.laf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel MyApp`。 - **方法三**:在`swing.properties`配置文件中修改`...

    laf 是开源的云开发平台,提供云函数、云数据库、云存储等开箱即用的应用资源 让开发者专注于业务开发,无需折腾服务器,快速释放创

    laf 是云开发平台,提供云函数、云数据库、云存储等开箱即用的应用资源。让开发者快速释放创意。ChatGPT 自动写函数,秒级上线,世界上只有两种 serverless,30 秒上线的 和 30 秒劝退的!

Global site tag (gtag.js) - Google Analytics