衆所周知,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,否則不能用方法setOpaque()來使內容窗格透明 ,使內容窗格透明後才能顯示背景圖片
JPanel imagePanel = (JPanel) jf.getContentPane(); //將圖片加入到背景窗格
imagePanel.setOpaque(false); // 把背景圖片添加到分層窗格的最底層作爲背景
jf.getLayeredPane().add(bl, new Integer(Integer.MIN_VALUE));
jf.setVisible(true); //設置窗口可見
但發現我們的窗口無法拖動。現在就要加入一段代碼實現拖動:
先在我們的類裏面定義兩個全局變量作爲鼠標位置:
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{
ImageIcon background = new ImageIcon("res\\bg1.png"); // 創建一個名爲background的圖片對象,把背景圖片加進去
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);
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,否則不能用方法setOpaque()來使內容窗格透明 ,使內容窗格透明後才能顯示背景圖片
JPanel imagePanel = (JPanel) jf.getContentPane(); //將圖片加入到背景窗格
imagePanel.setOpaque(false); // 把背景圖片添加到分層窗格的最底層作爲背景
jf.getLayeredPane().add(bl, new Integer(Integer.MIN_VALUE));
jf.setVisible(true); //設置窗口可見
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)); //設置拖拽後,窗口的位置
}
});
JPanel p=new JPanel(); //實例化JPanel對象
p.setLayout(null);
p.add(frtitle);
p.add(close);
jf.getContentPane().add(p);
p.setOpaque(false); //面板設置爲透明以顯示背景
jf.show();
}
}