众所周知,Java的默认窗口使用的是系统默认样式,那么我们如何自己定义样式使其更好看呢?下面我就来分享一下如何自定义样式。
然后开始。
先创建两个图片对象,把图片资源文件加进去。
ImageIcon background = new ImageIcon("res\\bg1.png"); // 创建一个名为background的图片对象,把背景图片加进去
ImageIcon buttonc=new ImageIcon("res\\close-r.png"); // 创建一个名为buttonc的图片对象,把按钮贴图加进去
可以看到我们使用的是相对路径,及相对我们软件导出后的jar文件路径。而在eclipse ide中,工程文件夹的bin文件夹就可以等效为我们导出的jar文件。
然后需要把图片加到我们窗口背景里,如下:
JFrame jf=new JFrame();
jf.setSize(400,235);
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension sc=kit.getScreenSize();
jf.setLocation((int)(sc.width/2.7f),sc.height/3);
jf.setUndecorated(true); //窗口去边框
JLabel bl=new JLabel(background); // 把上面的图片对象加到一个名为bl的标签里
bl.setBounds(0,0,jf.getWidth(),jf.getHeight()); //设置标签大小
JPanel imagePanel=(JPanel)jf.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 ,使内容窗格透明后才能显示背景图片
imagePanel.setOpaque(false); // 把背景图片添加到分层窗格的最底层作为背景
jf.getLayeredPane().add(bl,new Integer(Integer.MIN_VALUE));
但发现我们的窗口无法拖动。现在就要加入一段代码实现拖动:
先在我们的类里面定义两个全局变量作为鼠标位置:
static int mouseAtX;
static int mouseAtY;
然后在主方法加入如下代码:
jf.addMouseListener(new MouseAdapter() { //设置窗口可拖动,添加监听器
public void mousePressed(MouseEvent e) { //获取点击鼠标时的坐标
mouseAtX=e.getPoint().x;
mouseAtY=e.getPoint().y;
}
});
jf.addMouseMotionListener(new MouseMotionAdapter() { //设置拖拽后,窗口的位置
public void mouseDragged(MouseEvent e) {
jf.setLocation(e.getXOnScreen()-mouseAtX,e.getYOnScreen()-mouseAtY);
}
});
现在添加组件,按钮为了好看需要去按钮边框和设置按钮背景透明,并加入贴图,如下:
JButton close=new JButton(buttonc); //实例化按钮对象并加入上面的贴图
close.setContentAreaFilled(false); //设置按钮背景透明
close.setBorderPainted(false); //去掉按钮边框
创建标签文本:
JLabel frtitle=new JLabel("窗口标题");
通常使用JPanel面板对象加入,规整并布局组件,再加入到窗口中,如下:
JPanel p=new JPanel(); //实例化JPanel对象
p.setLayout(null);
p.add(frtitle);
p.add(close);
jf.getContentPane().add(p);
但是运行后我们失望地发现:
背景没了!
那是因为JPanel也有一个不透明的背景,加入到窗口后遮挡了背景,只需一行代码设置面板透明即可:
p.setOpaque(false); //面板设置为透明以显示背景
窗口就做完了!
完整代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class MainGUI{
static int mouseAtX;
static int mouseAtY;
public static void main(String[] args) throws Exception {
JFrame jf=new JFrame();
jf.setSize(400,235);
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension sc=kit.getScreenSize();
jf.setLocation((int)(sc.width/2.7f),sc.height/3);
jf.setUndecorated(true); //窗口去边框
ImageIcon background=new ImageIcon("res\\bg1.png"); // 创建一个名为background的图片对象,把背景图片加进去
JLabel bl=new JLabel(background); // 把上面的图片对象加到一个名为bl的标签里
bl.setBounds(0,0,jf.getWidth(),jf.getHeight()); //设置标签大小
JPanel imagePanel=(JPanel)jf.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 ,使内容窗格透明后才能显示背景图片
imagePanel.setOpaque(false); // 把背景图片添加到分层窗格的最底层作为背景
jf.getLayeredPane().add(bl,new Integer(Integer.MIN_VALUE));
jf.addMouseListener(new MouseAdapter() { //设置窗口可拖动
public void mousePressed(MouseEvent e) { //获取点击鼠标时的坐标
mouseAtX = e.getPoint().x;
mouseAtY= e.getPoint().y;
}
});
jf.addMouseMotionListener(new MouseMotionAdapter() { //设置拖拽后,窗口的位置
public void mouseDragged(MouseEvent e) {
jf.setLocation(e.getXOnScreen()-mouseAtX,e.getYOnScreen()-mouseAtY);
}
});
ImageIcon buttonc=new ImageIcon("res\\close-r.png"); // 创建一个名为buttonc的图片对象,把按钮贴图加进去
JButton close=new JButton(buttonc); //实例化按钮对象并加入贴图
close.setContentAreaFilled(false); //设置按钮背景透明
close.setBorderPainted(false); //去掉按钮边框
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
close.setBounds(353, 2, 28, 28);
JLabel frtitle=new JLabel("窗口标题");
frtitle.setBounds(10, 5, 85, 27);
JPanel p=new JPanel(); //实例化JPanel对象
p.setOpaque(false); //面板设置为透明以显示背景
p.setLayout(null);
p.add(frtitle);
p.add(close);
jf.getContentPane().add(p);
jf.show();
}
}