English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Wie man ein Fenster mit jeder beliebigen Bildhintergrund erstellt

Swing自带的窗口无法满足我们的应用需求,因此需要制作任意图片和形状的JFrame窗口,例如下图:

并且可以设置窗口背景图片的透明度

下面说明如何实现上图的效果:

(1)首先你得需要一张好看的图片,比如羊皮纸。但是这个下载的图片是方方正正的矩形,羊皮纸的形状在图片的内部,所以我们用美图秀秀或者PS中的抠图功能将羊皮纸抠出来,如下:


(2)将图片保存为透明背景即可。
(3)接着编写一个继承自JFrame的myJFrame类,代码如下:

import com.sun.awt.AWTUtilities; 
import javax.swing;*; 
import java.awt;*; 
public class myJFrame extends JFrame{ 
  private float alpha; 
    public myJFrame(String bgPath,float alpha){ 
      super(); 
      myContentPane rp = new myContentPane(bgPath); 
      rp.setOpaque(false);//设置内容面板为透明 
      this.setContentPane(rp); 
      this.setUndecorated(true); 
      this.setSize(rp.img.getIconWidth(), rp.img.getIconHeight()); 
      AWTUtilities.setWindowOpaque(this, false);//JFrame transparent machen 
      this.alpha = alpha; 
    ) 
  private class myContentPane extends JPanel{ 
    public ImageIcon img; 
    public myContentPane(String bgPath) { 
      super(); 
      img = new ImageIcon(Test.class.getResource(bgPath)); 
    ) 
    @Override 
    protected void paintComponent(Graphics g) { 
      AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); 
      Composite old = ((Graphics2D) g).getComposite(); 
      ((Graphics2D) g).setComposite(ac); 
      if(img!=null){ 
        g.drawImage(img.getImage(), 0, 0, getWidth(), getHeight(), this); 
      ) 
      ((Graphics2D) g).setComposite(old); 
      super.paintComponent(g); 
    ) 
  ) 
) 

Der Hauptteil des obigen Codes besteht darin: JFrame transparent machen, JFrame die Kanten entfernen, das Inhaltsfeld transparent machen und dann das Bild auf das Inhaltsfeld malen.

(4) Ein Test-Klasse erstellen:

import javax.swing;*; 
import java.awt;*; 
public class Test { 
  public static void main(String[] args) { 
    /** 
     * Einstellen des Hintergrundbildes und der Transparenz des Hintergrundbildes, 0 für vollkommen transparent,1.0f für undurchsichtig. 
     */ 
    myJFrame f = new myJFrame("ab.png",0.7f); 
    f.setLayout(null); 
    Font font = new Font("宋体", Font.PLAIN,30); 
    JLabel user = new JLabel("用户名"); 
    user.setFont(font); 
    user.setBounds(100,150,100,30); 
    JTextField userInput = new JTextField(); 
    userInput.setFont(font); 
    userInput.setBounds(200,145,250,40); 
    JLabel ps = new JLabel("密码"); 
    ps.setFont(font); 
    ps.setBounds(110,200,90,30); 
    JTextField psInput = new JTextField(); 
    psInput.setFont(font); 
    psInput.setBounds(200,195,250,40); 
    f.add(user); 
    f.add(userInput); 
    f.add(ps); 
    f.add(psInput); 
    f.setLocation(300,100); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
  ) 
) 

(5由于去掉了边框,所以窗体不能拖动和拉伸。拖动和拉伸功能的实现请参考这篇文章:Swing实现窗体拖拽和拉伸。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来自网络,版权归原创者所有。内容由互联网用户自发贡献并自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,请发送邮件至:notice#oldtoolbag.com(在发送邮件时,请将#替换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)

Vielleicht gefällt Ihnen auch