Java 自定义窗体(标题栏、窗体背景)

感谢大佬:https://blog.csdn.net/ltx06/article/details/28996839

最近在书上看到这篇文章,觉得挺有意思。与大家分享一下,具体可以参见明日科技出版的《Java经典编程300例》。

默认情况下,我们用java设计的界面窗体是这样的:
在这里插入图片描述
默认的标题栏、最大化、最小化、关闭按钮、窗体边框。

如何自定义窗体达到如下效果呢?
在这里插入图片描述
大致说下代码要点:

  1. 设置窗体的Undecorated属性为true,阻止窗体采用本机系统修饰,这样窗体就没有标题栏和边框了。
  2. 设计背景面板类。BackgroundPanel extends JPanel。
  3. 窗体面板添加标题栏面板,位置在上方。
  4. 标题栏面板添加背景面板显示标题栏图片、标题栏面板添加面板用于放置最大化、最小化、关闭按钮。
  5. 窗体面板添加背景面板在中间。contentPane.add(mianPanel,BorderLayout.Center);
  6. 添加按钮响应、添加标题栏拖动代码。

代码:

首先是带背景图片面板类:

package cn.chengmaoning.customframe;      
              
import java.awt.Graphics;      
import java.awt.Image;      
              
import javax.swing.JPanel;      
              
public class BackgroundPanel extends JPanel {      
              
    /**      
     *       
     */
    private static final long serialVersionUID = -898997756345637309L;      
    private Image image;      
              
    /**      
     * Constructor      
     */
    public BackgroundPanel() {      
        super();      
        setOpaque(false);      
        setLayout(null);      
    }      
              
    /**      
     * @param image      
     *            要设置的 image      
     */
    public void setImage(Image image) {      
        this.image = image;      
    }      
              
    @Override
    protected void paintComponent(Graphics g) {      
        if (image != null) {      
            int width = getWidth();// 获取组件大小      
            int height = getHeight();      
            g.drawImage(image, 0, 0, width, height, this);// 绘制图片与组件大小相同      
        }      
        super.paintComponent(g);// 执行超类方法      
    }      
                  
}

其次再是主类:

package cn.chengmaoning.customframe;     
            
import java.awt.BorderLayout;     
import java.awt.Dimension;     
import java.awt.EventQueue;     
import java.awt.FlowLayout;     
import java.awt.GridLayout;     
import java.awt.Image;     
import java.awt.Point;     
import java.awt.event.ActionEvent;     
import java.awt.event.ActionListener;     
import java.awt.event.ItemEvent;     
import java.awt.event.ItemListener;     
import java.awt.event.MouseAdapter;     
import java.awt.event.MouseEvent;     
import java.awt.event.MouseMotionAdapter;     
            
import javax.jws.Oneway;     
import javax.swing.ImageIcon;     
import javax.swing.JButton;     
import javax.swing.JFrame;     
import javax.swing.JPanel;     
import javax.swing.JToggleButton;     
            
public class ControlFormStatus extends JFrame {     
            
    /**     
     *      
     */
    private static final long serialVersionUID = -2214759764324605473L;     
    private JPanel contentPane;     
    private Point pressedPoint;     
                
    /**     
     * @param args     
     */
    public static void main(String[] args) {     
        // TODO 自动生成的方法存根     
        EventQueue.invokeLater(new Runnable() {     
                        
            @Override
            public void run() {     
                // TODO 自动生成的方法存根     
                try {     
                    ControlFormStatus frame = new ControlFormStatus();     
                    frame.setVisible(true);     
                } catch (Exception e) {     
                    // TODO: handle exception     
                    e.printStackTrace();     
                }     
            }     
        });     
    }     
                
    /**     
     * Constructor     
     */
    public ControlFormStatus(){     
        setUndecorated(true);     
        setDefaultCloseOperation(EXIT_ON_CLOSE);     
        setBounds(100, 100, 450, 300);     
        contentPane = new JPanel();     
        contentPane.setBorder(null);     
        contentPane.setLayout(new BorderLayout(0, 0));     
        setContentPane(contentPane);     
                    
        BackgroundPanel topPanel = new BackgroundPanel();     
        topPanel.addMouseMotionListener(new MouseMotionAdapter() {     
            @Override
            public void mouseDragged(MouseEvent e){     
                do_topPanel_mouseDragged(e);     
            }     
        });     
        topPanel.addMouseListener(new MouseAdapter() {     
            @Override
            public void mousePressed(MouseEvent e) {     
                // TODO 自动生成的方法存根     
                do_topPanel_mousePressed(e);     
            }     
        });     
        Image centerImage = new ImageIcon(getClass().getResource("frameTop.png")).getImage();     
        Dimension dimension = new Dimension(centerImage.getWidth(this), centerImage.getHeight(this));     
        topPanel.setPreferredSize(dimension);     
        topPanel.setImage(centerImage);     
                    
        contentPane.add(topPanel,BorderLayout.NORTH);     
        topPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));     
                    
        JPanel panel = new JPanel();     
        panel.setPreferredSize(new Dimension(60, 22));     
        panel.setOpaque(false);     
        topPanel.add(panel);     
        panel.setLayout(new GridLayout(1, 0, 0, 0));     
                    
        JButton button = new JButton("");     
        button.setRolloverIcon(new ImageIcon(ControlFormStatus.class.getResource("minBH.jpg")));     
        button.addActionListener(new ActionListener() {     
                        
            @Override
            public void actionPerformed(ActionEvent e) {     
                // TODO 自动生成的方法存根     
                do_button_actionPerformed(e);     
            }     
        });     
        button.setFocusPainted(false);     
        button.setBorderPainted(false);     
        button.setContentAreaFilled(false);     
        button.setIcon(new ImageIcon(ControlFormStatus.class.getResource("minB.jpg")));     
        panel.add(button);     
                    
        JToggleButton button_1 = new JToggleButton("");     
        button_1.addItemListener(new ItemListener() {     
                        
            @Override
            public void itemStateChanged(ItemEvent e) {     
                // TODO 自动生成的方法存根     
                do_button_1_itemStateChanged(e);     
            }     
        });     
        button_1.setRolloverIcon(new ImageIcon(ControlFormStatus.class.getResource("maxBH.jpg")));     
        button_1.setRolloverSelectedIcon(new ImageIcon(ControlFormStatus.class.getResource("maxBH.jpg")));     
        button_1.setIcon(new ImageIcon(getClass().getResource("maxB.jpg")));     
        button_1.setContentAreaFilled(false);     
        button_1.setBorderPainted(false);     
        button_1.setFocusPainted(false);     
        panel.add(button_1);     
                    
        JButton button_2 = new JButton("");     
        button_2.addActionListener(new ActionListener() {     
                        
            @Override
            public void actionPerformed(ActionEvent e) {     
                // TODO 自动生成的方法存根     
                do_button_2_actionPerformed(e);     
            }     
        });     
        button_2.setRolloverIcon(new ImageIcon(getClass().getResource("closeBH.jpg")));     
        button_2.setIcon(new ImageIcon(getClass().getResource("closeB.jpg")));     
        button_2.setFocusPainted(false);     
        button_2.setContentAreaFilled(false);     
        button_2.setBorderPainted(false);     
        panel.add(button_2);     
                    
        BackgroundPanel baclBackgroundPanel_1 = new BackgroundPanel();     
        Image topImage = new ImageIcon(getClass().getResource("frameCenter.png")).getImage();     
        baclBackgroundPanel_1.setImage(topImage);     
        contentPane.add(baclBackgroundPanel_1, BorderLayout.CENTER);     
                    
    }     
            
    protected void do_button_2_actionPerformed(ActionEvent e) {     
        // TODO 自动生成的方法存根     
        dispose();     
    }     
            
    protected void do_button_1_itemStateChanged(ItemEvent e) {     
        // TODO 自动生成的方法存根     
        if (e.getStateChange() == ItemEvent.SELECTED) {     
            setExtendedState(MAXIMIZED_BOTH);     
        } else {     
            setExtendedState(NORMAL);     
        }     
    }     
            
    protected void do_button_actionPerformed(ActionEvent e) {     
        // TODO 自动生成的方法存根     
        setExtendedState(ICONIFIED);     
    }     
            
    protected void do_topPanel_mousePressed(MouseEvent e) {     
        // TODO 自动生成的方法存根     
        pressedPoint = e.getPoint();     
    }     
            
    protected void do_topPanel_mouseDragged(MouseEvent e) {     
        // TODO 自动生成的方法存根     
        Point point = e.getPoint();     
        Point locationPoint = getLocation();     
                    
        int x = locationPoint.x + point.x - pressedPoint.x;     
        int y = locationPoint.y + point.y - pressedPoint.y;     
                    
        setLocation(x, y);     
    }     
            
}

代码中用到的图片如下:(我不知道有什么更好的方法可以把图片保存到这篇文章里,所以只有贴到这里了,试验的同学可以直接另存图片到本机,放置到与.java相同路径下即可)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,要将窗体设置为透明,可以使用以下步骤: 1. 首先,确保你在使用 Java Swing 或 JavaFX 进行窗体开发。 2. 在创建窗体的代码之前,需要导入相关的库文件。对于 Java Swing,你需要导入 javax.swing 包;对于 JavaFX,你需要导入 javafx.stage 包。 3. 创建窗体对象,并设置其属性。 4. 调用窗体对象的 setUndecorated(true) 方法,以去除窗体的边框和标题栏。 5. 调用窗体对象的 setBackground(new Color(0, 0, 0, 0)) 方法,将窗体背景设置为透明色。这里的参数依次代表红、绿、蓝、透明度,其中透明度为 0 表示完全透明。 6. 最后,调用窗体对象的 setVisible(true) 方法,显示窗体。 下面是一个使用 Java Swing 实现窗体透明的示例代码: ```java import javax.swing.*; import java.awt.*; public class TransparentFrameExample { public static void main(String[] args) { JFrame frame = new JFrame("Transparent Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setUndecorated(true); // 去除边框和标题栏 frame.setBackground(new Color(0, 0, 0, 0)); // 设置背景为透明色 // 添加组件到窗体中 JLabel label = new JLabel("Hello, Transparent Frame!"); label.setHorizontalAlignment(SwingConstants.CENTER); label.setFont(new Font("Arial", Font.BOLD, 24)); frame.getContentPane().add(label); frame.setSize(400, 300); frame.setLocationRelativeTo(null); // 居中显示 frame.setVisible(true); } } ``` 希望这能帮助到你!如果有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值