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

Création d'une fenêtre avec un fond d'image arbitraire en Java

swing自带的窗体是不能够满足我们的应用需求的,所以需要制作任意图片和形状的JFrame框体,比如下图:

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

下面说明如何做到上图的效果:

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


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

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);//Régler JFrame comme transparent 
      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); 
    } 
  } 
} 

Le code principal du programme ci-dessus consiste en : définir JFrame comme transparent, supprimer la bordure de JFrame, définir le panneau de contenu comme transparent, puis dessiner l'image sur le panneau de contenu.

(4); Écrire une classe de test Test:

import javax.swing;*; 
import java.awt;*; 
public class Test { 
  public static void main(String[] args) { 
    /** 
     * Définir l'image de fond et la transparence de l'image de fond, 0 est complètement transparent,1.0f est opaque. 
     */ 
    myJFrame f = new myJFrame("ab.png",0.7f); 
    f.setLayout(null); 
    Font font = new Font("宋体",Font.PLAIN,30); 
    JLabel user = new JLabel("Nom d'utilisateur"); 
    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("Mot de passe"); 
    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)En raison de la suppression des bordures, la fenêtre ne peut pas être glissée ni étirée. La mise en œuvre des fonctions de glissement et d'étirement est détaillée dans cet article : Swing Implementation de la glissière et de l'étirement de la fenêtre

C'est tout pour cet article, j'espère que cela peut aider à votre apprentissage, et j'espère que vous pourrez soutenir davantage le tutoriel de cri.

Déclaration : le contenu de cet article est extrait du réseau, la propriété intellectuelle appartient à l'auteur original, le contenu est fourni par les utilisateurs d'Internet et téléchargé spontanément, ce site n'appartient pas à la propriété intellectuelle, n'a pas été édité par l'homme, ni n'assume la responsabilité des responsabilités juridiques pertinentes. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un email à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un email pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)

Vous pourriez aussi aimer