seticon gui java image swing jframe image-viewer

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);