`

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)的一部分,为开发跨平台的桌面应用程序...

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

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

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

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

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

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

    在跨平台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的外观和行为。本示例将详细介绍如何自定义...

    java 皮肤 苹果风格 超漂亮

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

    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