2015-12-06 2 views
0

Je voudrais que le JDesktopPane soit transparent et permettez-moi de cliquer sur ce qui est en dessous (par exemple, les icônes du bureau, etc.). Le cadre interne doit rester opaque et pouvoir être repositionné sur l'écran comme il le fait actuellement. Des idées?Transparent JDesktopPane

package test1; 

    import java.awt.BorderLayout; 
    import java.awt.Color; 
    import javax.swing.JDesktopPane; 
    import javax.swing.JFrame; 
    import javax.swing.JInternalFrame; 
    import javax.swing.JLabel; 


    public class Test1 { 

    public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setUndecorated(true); 


    JDesktopPane desktop = new JDesktopPane(); 
    JInternalFrame internalFrame = new JInternalFrame("Title", false, true, false, true); 
    desktop.setBackground(Color.RED); 
    //desktop.setBackground(new Color(1.0f,1.0f,1.0f,0.0f)); 
    desktop.add(internalFrame); 
    internalFrame.setBounds(25, 25, 200, 100); 
    internalFrame.setVisible(true); 
    frame.add(desktop, BorderLayout.CENTER); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

    } 

} 
+0

Je compris cela. J'ai changé Color.RED à la nouvelle couleur (0,0,0,0) et ai dû ajouter également frame.setBackground (nouvelle couleur (0,0,0,0)); à la fin. J'espère que ça aide quelqu'un. – volican

+0

En fait cette seule partie a fonctionné, elle est maintenant transparente mais je ne peux pas cliquer. – volican

+0

C'est en fait une très mauvaise idée, Swing ne sait pas comment peindre des composants opaques qui ont une couleur transparente, à la place, vous devez "simuler", en rendant le composant transparent, puis en surchargeant sa méthode 'paintComponent' et en utilisant un 'AlphaComposite'. Ceci est encore compliqué par le fait que 'JInternalFrame' a un' JRootPane' et 'contentPane' qui sont aussi opaques – MadProgrammer

Répondre

4

N ° 1 Translucide JInternalFrame

Création d'un composant translucide est plus impliqué alors que la mise en la couleur de fond à une valeur en fonction alpha. Swing ne sait peindre que des composants opaques ou totalement transparents, l'API est également optimisée de telle sorte que si elle met à jour un composant opaque, elle ne mettra pas à jour la zone du parent derrière le composant. L'utilisation d'une couleur alpha générera toutes sortes d'artefacts de peinture désagréables

Au lieu de cela, vous devez "simuler". Cela implique la mise en composant à PRÉPONDÉRANTS complètement les composants méthode paint et en utilisant un AlphaComposite pour générer l'effet translucide (normalement j'utiliser la méthode paintComponent, mais vous devez vous rappeler que cela laisserait les composants enfants non atteints)

Desktop

import java.awt.AlphaComposite; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Main { 

    public static void main(String[] args) { 
     new Main(); 
    } 

    public Main() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
         ex.printStackTrace(); 
        } 

        JDesktopPane dp = new BackgroundDesktopPane(); 

        BufferedImage img = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\SmallPony.png")); 

        TransparentInternalFrame iframe = new TransparentInternalFrame("Banana", true, true, true, true); 
        iframe.setLocation(10, 10); 
        iframe.add(new JLabel(new ImageIcon(img))); 
        iframe.pack(); 
        iframe.setVisible(true); 

        dp.add(iframe); 


        JFrame frame = new JFrame("Testing"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(dp); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException ex) { 
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
    } 

    public class TransparentInternalFrame extends JInternalFrame { 

     public TransparentInternalFrame() { 
      super(); 
     } 

     public TransparentInternalFrame(String title) { 
      super(title); 
     } 

     public TransparentInternalFrame(String title, boolean resizable) { 
      super(title, resizable); 
     } 

     public TransparentInternalFrame(String title, boolean resizable, boolean closable) { 
      super(title, resizable, closable); 
     } 

     public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) { 
      super(title, resizable, closable, maximizable); 
     } 

     public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) { 
      super(title, resizable, closable, maximizable, iconifiable); 
     } 

     @Override 
     public void paint(Graphics g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.25f)); 
      super.paint(g2d); 
      g2d.dispose(); 
     } 

    } 

    public class BackgroundDesktopPane extends JDesktopPane { 

     private BufferedImage background; 

     public BackgroundDesktopPane() throws IOException { 
      background = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\800px-Rainbow_Dash_flying_past_1_S2E16.png")); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (background != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       int x = (getWidth() - background.getWidth())/2; 
       int y = (getHeight() - background.getHeight())/2; 
       g2d.drawImage(background, x, y, this); 
       g2d.dispose(); 
      } 
     } 



    } 

} 

N ° 2 cliquez par ...

offrant la possibilité de cliquer sur les composants est beaucoup plus difficile et devient beaucoup plus difficile si vous ajoutez des composants qui prennent en charge les événements de souris. Les éléments suivants permettront aux événements de la souris de "tomber" sur le composant (attendez les cartes de trame), mais tout composant dans le cadre interne qui répond aux événements de la souris empêchera le fonctionnement.

Click Through

public class TransparentInternalFrame extends JInternalFrame { 

    public TransparentInternalFrame() { 
     super(); 
     setOpaque(false); 
     init(); 
    } 

    public TransparentInternalFrame(String title) { 
     super(title); 
     setOpaque(false); 
     init(); 
    } 

    public TransparentInternalFrame(String title, boolean resizable) { 
     super(title, resizable); 
     setOpaque(false); 
     init(); 
    } 

    public TransparentInternalFrame(String title, boolean resizable, boolean closable) { 
     super(title, resizable, closable); 
     setOpaque(false); 
     init(); 
    } 

    public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) { 
     super(title, resizable, closable, maximizable); 
     setOpaque(false); 
     init(); 
    } 

    public TransparentInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) { 
     super(title, resizable, closable, maximizable, iconifiable); 
     setOpaque(false); 
     init(); 
    } 

    protected void init() { 
     MouseAdapter proxy = new MouseAdapter() { 

      protected void dispatchEventToParent(MouseEvent e) { 
       Container parent = getParent(); 
       if (parent != null) { 
        e = SwingUtilities.convertMouseEvent(e.getComponent(), e, parent); 
        parent.dispatchEvent(e); 
       } 
      } 

      @Override 
      public void mouseMoved(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mouseDragged(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mouseWheelMoved(MouseWheelEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       dispatchEventToParent(e); 
      } 

     }; 

     addMouseListener(proxy); 
     addMouseMotionListener(proxy); 
     addMouseWheelListener(proxy); 
    } 

    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setComposite(AlphaComposite.SrcOver.derive(0.25f)); 
     super.paint(g2d); 
     g2d.dispose(); 
    } 

} 

public class BackgroundDesktopPane extends JDesktopPane { 

    private BufferedImage background; 
    private List<Point> points; 

    public BackgroundDesktopPane() throws IOException { 
     points = new ArrayList<>(25); 
     background = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\800px-Rainbow_Dash_flying_past_1_S2E16.png")); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       points.add(e.getPoint()); 
       repaint(); 
      } 

     }); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     if (background != null) { 
      int x = (getWidth() - background.getWidth())/2; 
      int y = (getHeight() - background.getHeight())/2; 
      g2d.drawImage(background, x, y, this); 
     } 

     g2d.setColor(Color.RED); 
     for (Point p : points) { 
      g2d.fillOval(p.x - 5, p.y - 5, 10, 10); 
     } 
     g2d.dispose(); 
    } 

} 
+0

Merci beaucoup pour votre aide. J'ai seulement commencé avec Java ce matin, donc je vais expérimenter avec votre code. – volican

+0

Eh bien, vous vous aventurez dans des concepts très avancés au sein de l'API, ce qui pourrait être mieux laissé jusqu'à ce que vous ayez une meilleure compréhension des bases – MadProgrammer