Java-創建一個自定義窗口,扁平化界面

    衆所周知,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();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章