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();
	}
}
发布了24 篇原创文章 · 获赞 28 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/yanhanhui1/article/details/82428343