Невозможно правильно понять код

В следующем коде я не могу понять, какие методы setBackground() устанавливают фон для какого слоя. Во-вторых, когда я включаю эту строку, почему в окне появляется дыра, это означает, что когда я щелкаю между окном, оно минимизируется, поскольку я щелкнул где-то еще.

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
java.awt.GraphicsDevice;
import java.awt.GraphicsDevice.WindowTranslucency;
import java.awt.GraphicsEnvironment;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class transparentWindow extends JFrame {

public transparentWindow() {
    // TODO Auto-generated constructor stub
    //JFrame jfrm=new JFrame("Transparent Window");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300,200);
    getContentPane().setLayout(new FlowLayout());
    //setBackground(new Color(0,0,0,0));

    add(new JButton("Enter"));
    setOpacity(0.7f);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd=ge.getDefaultScreenDevice();
    if(!gd.isWindowTranslucencySupported(WindowTranslucency.TRANSLUCENT))
    {
        System.out.println("Transparency not supported");
        System.exit(0);
    }
    JFrame.setDefaultLookAndFeelDecorated(true);
    SwingUtilities.invokeLater(new Runnable(){public void run(){new transparentWindow();}});
}

}

person Insane Coder    schedule 08.08.2012    source источник


Ответы (2)


Все методы, которые не вызываются для конкретного объекта, на самом деле вызываются для this, поэтому

setBackground(new Color(0,0,0,0));

так же, как

this.setBackground(new Color(0,0,0,0));

Это означает, что он вызывается на JFrame.

person MByD    schedule 08.08.2012
comment
Тогда JFrame должен был стать прозрачным, но панель содержимого по-прежнему непрозрачна. Это похоже на то, что contentPane() является частью jframe, поэтому установка прозрачности jframe делает все 3-контентную панель, стеклянную панель и многоуровневую панель прозрачной? - person Insane Coder; 08.08.2012
comment
@Naveen Попробуйте сделать панель содержимого прозрачной, самым простым способом было бы создать JPanel, вызвав setOpaque(false) на панели, затем вызвав setContentPane JFrame, передав панель - person MadProgrammer; 08.08.2012
comment
@MadProgrammer Использование этого метода сделает панель содержимого прозрачной, но JFrame по-прежнему непрозрачен, поэтому он не будет иметь никакого эффекта. - person Insane Coder; 08.08.2012
comment
@Naveen, извините, вы также должны сделать рамку неукрашенной - person MadProgrammer; 08.08.2012

Другая проблема, которую вы обнаружите, заключается в том, что установка фрейма opacity одинаково повлияет на все его дочерние элементы.

Если вы хотите увидеть хорошее длинное обсуждение (и пример), см. как сделать фон JFrame прозрачным, а фон JPanel или JLabel непрозрачным?

person MadProgrammer    schedule 08.08.2012
comment
Спасибо за ссылку. Преподал отличные новые концепции - person Insane Coder; 08.08.2012