gui - seticon java jlabel
cómo configurar el fondo JFrame transparente pero JPanel o JLabel Background opaco? (1)
Según la tarea, tenemos que crear un visor de imágenes como Picasas uno. imagen en el centro, fondo negro translúcido y cambio de imágenes con los botones izquierda / derecha.
puedo mostrar una imagen, configurarla con una capa inferior, configurarla en un marco translúcido pero, junto con el marco, la imagen se vuelve translúcida. Qué estoy haciendo mal.
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
JFrame f1 = new JFrame("ShowImage");
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setSize(dim);
f1.setUndecorated(true);
f1.setOpacity(0.5f);
ShowImage panel = new ShowImage();
panel.setBackground(Color.black);
f1.setContentPane(panel);
f1.setVisible(true);
Lo intenté
si.setOpaque();
si.setBackground(Color.black);
si.setForeground(Color.red);
ninguno funcionó
cuando tomé un booleano y probé
si.isDisplayable();
si.isVisible();
si.isShowing();
solo es visible devuelve verdadero, el resto es falso, ¿son estos factores contribuyentes?
El problema es que el administrador de Layout
predeterminado de JFrame
es BorderLayout
, esto significa que su panel ShowImage
está ocupando todo el área del marco (en negro). Apuesto si cambiaste el fondo del ShowPane
a rojo. Aparecería completamente lleno de rojo en su lugar
Ahora puede echar un vistazo a Una guía visual para los administradores de diseño o cambiar la forma en que funciona su ShowPane
ACTUALIZAR
Disculpas, no estoy familiarizado con la nueva API de Transparencia en Java 7 (aún usando el hack de Java 6;))
¿Puedes verificar por mí que este es el tipo de efecto que estás buscando? Donde el cuadrado leído sería la imagen (y el fondo negro es el marco - nb, solo capturé el marco)
ACTUALIZAR
Primero, quiere leer Window.isOpaque y Window.setBackground para comprender cómo funciona esta solución.
A continuación, no use Window.setOpacity , no va a lograr lo que desea. La razón principal es que el valor de opacidad se aplica al padre y sus hijos (esto a través de mí al principio).
Entonces, el código de marco:
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Make sure where in the top left corner, please lookup how
// to find the screen insets ;)
setLocation(0, 0);
setSize(dim);
// Set undecorated
setUndecorated(true);
// Apply a transparent color to the background
// This is ALL important, without this, it won''t work!
setBackground(new Color(0, 255, 0, 0));
// This is where we get sneaky, basically where going to
// supply our own content pane that does some special painting
// for us
setContentPane(new ContentPane());
getContentPane().setBackground(Color.BLACK);
setLayout(new BorderLayout());
// Add out image pane...
ShowImage panel = new ShowImage();
add(panel);
setVisible(true);
El ContentPane
. Básicamente, tenemos que "engañar" al motor de pintura para que piense dónde es transparente (no opaco) y luego pintar nuestra propia opacidad
public class ContentPane extends JPanel {
public ContentPane() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
// Allow super to paint
super.paintComponent(g);
// Apply our own painting effect
Graphics2D g2d = (Graphics2D) g.create();
// 50% transparent Alpha
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2d.setColor(getBackground());
g2d.fill(getBounds());
g2d.dispose();
}
}
Lo siento por mi respuesta anterior, pero espero que esto lo compensa;)
ACTUALIZAR con botones
Así es como lo modifiqué
ShowImage panel = new ShowImage();
panel.setBackground(Color.RED);
setContentPane(new ContentPane());
getContentPane().setBackground(Color.BLACK);
setLayout(new BorderLayout());
add(panel);
JPanel pnlButtons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
pnlButtons.setOpaque(false);
pnlButtons.add(new JButton("<<"));
pnlButtons.add(new JButton("<"));
pnlButtons.add(new JButton(">"));
pnlButtons.add(new JButton(">>"));
// Okay, in theory, getContentPane() is required, but better safe the sorry
getContentPane().add(pnlButtons, BorderLayout.SOUTH);
setVisible(true);