swing皮肤确实是个问题,要自己做的话是非常麻烦的事情
substance是swing皮肤的理想选择,应用简单,皮肤效果众多,简单说明下用法
下载substance的jar文件,官网已经没有可以下载的了(可能是现在用swing的越来越少了吧)
下载地址:http://download.csdn.net/detail/shilonggang000/7196955
啥都不说了,先整个例子跑起来
import java.awt.Frame;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import org.jvnet.substance.SubstanceLookAndFeel;
import org.jvnet.substance.skin.OfficeBlue2007Skin;
import com.sunshine.sunsdk.swing.FStartWindow;
public class LoginUi extends JFrame {
JFrame jframe;
public void showLogin() {
JPanel panel;
JLabel biaoti, nameLable, passwordLable;
JTextField userName;
JPasswordField password;
JButton loginButton, cancelButton;
panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0, 0, 490, 360);
biaoti = new JLabel("登录");
biaoti.setBounds(panel.getSize().width / 2 - 40, 0, 300, 40);
nameLable = new JLabel("用户名");
nameLable.setBounds(100, 100, 75, 30);
passwordLable = new JLabel("密码");
passwordLable.setBounds(100, 140, 75, 30);
userName = new JTextField();
userName.setBounds(185, 100, 200, 25);
password = new JPasswordField();
password.setBounds(185, 140, 200, 25);
loginButton = new JButton();
loginButton.setText("登录");
loginButton.setBounds(160, 251, 80, 30);
cancelButton = new JButton();
cancelButton.setText("取消");
cancelButton.setBounds(280, 251, 80, 30);
panel.add(biaoti);
panel.add(nameLable);
panel.add(userName);
panel.add(passwordLable);
panel.add(password);
panel.add(loginButton);
panel.add(cancelButton);
panel.setOpaque(false);
jframe = new JFrame();
jframe.setBounds(500, 200, 490, 360);
jframe.add(panel);
jframe.setResizable(false);
jframe.setVisible(true);
}
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try{
SubstanceLookAndFeel.setSkin(new OfficeBlue2007Skin());
LoginUi test = new LoginUi();
test.showLogin();
}catch(Exception e){
e.printStackTrace();
}
}
});
}
}
出来的效果如图
说明:substance中 SubstanceLookAndFeel的setSkin方法必须是AWT 事件指派线程,即在SwingUtilities.invokeLater方法中起线程调用,否则会抛出异常"This method must be called on the Event Dispatch Thread";
substance中此处源码:
private static boolean setSkin(SubstanceSkin newSkin,
boolean toUpdateWindows) {
if (!SwingUtilities.isEventDispatchThread()) {
throw new IllegalStateException(
"This method must be called on the Event Dispatch Thread");
}
......
SubstanceLookAndFeel.setSkin(new OfficeBlue2007Skin());//此句设置了皮肤;
OfficeBlue2007Skin()为皮肤类可以替换下边的类改变风格
org.pushingpixels.substance.api.skin.AutumnSkin,
org.pushingpixels.substance.api.skin.BusinessSkin,
org.pushingpixels.substance.api.skin.BusinessBlackSteelSkin,
org.pushingpixels.substance.api.skin.BusinessBlueSteelSkin,
org.pushingpixels.substance.api.skin.ChallengerDeepSkin,
org.pushingpixels.substance.api.skin.CremeSkin,
org.pushingpixels.substance.api.skin.CremeCoffeeSkin,
org.pushingpixels.substance.api.skin.DustSkin,
org.pushingpixels.substance.api.skin.DustCoffeeSkin,
org.pushingpixels.substance.api.skin.EmeraldDuskSkin,
org.pushingpixels.substance.api.skin.GeminiSkin,
org.pushingpixels.substance.api.skin.GraphiteSkin,
org.pushingpixels.substance.api.skin.GraphiteAquaSkin,
org.pushingpixels.substance.api.skin.GraphiteGlassSkin,
org.pushingpixels.substance.api.skin.MagellanSkin,
org.pushingpixels.substance.api.skin.MarinerSkin,
org.pushingpixels.substance.api.skin.MistAquaSkin,
org.pushingpixels.substance.api.skin.MistSilverSkin,
org.pushingpixels.substance.api.skin.ModerateSkin,
org.pushingpixels.substance.api.skin.NebulaSkin,
org.pushingpixels.substance.api.skin.NebulaBrickWallSkin,
org.pushingpixels.substance.api.skin.OfficeBlack2007Skin,
org.pushingpixels.substance.api.skin.OfficeBlue2007Skin,
org.pushingpixels.substance.api.skin.OfficeSilver2007Skin,
org.pushingpixels.substance.api.skin.RavenSkin,
org.pushingpixels.substance.api.skin.SaharaSkin
试试效果吧!