Java – Transparent JScrollPane

Tengo un JTextArea y está montado sobre un JScrollPane. De todos modos, sé que puedo usar el método getViewPort() para establecer el opaco del puerto de vista … pero parece que no puedo encontrar ningún signo de cómo hacerlo … en ningún lado. : S

Esto es lo que tengo hasta ahora:

  if (e.getKeyCode() == KeyEvent.VK_F) { if (sp.isVisible()) { sp.setVisible(false); } else { sp.setVisible(true); } } 

Su coloquio con @Serplat sugiere que puede estar confundiendo la opacidad y la transparencia .

La opacidad es una propiedad booleana de los componentes Swing utilizados para optimizar el dibujo:

  • true : el componente acepta pintar todos los bits contenidos dentro de sus límites rectangulares.
  • false : el componente no garantiza que se pintarán todos los bits dentro de sus límites rectangulares.

La transparencia es un medio para componer imágenes digitales, como se ve en este ejemplo .

Tener en cuenta la distinción puede ayudar a aclarar su pregunta o enfocar su búsqueda para obtener más información.

Adición: Basado en el ejemplo de @camickr, el ejemplo siguiente muestra un cuadrado azul que se “pega” a la ventana gráfica, mientras que el tablero gris puede desplazarse sobre él.

ScrollPanePaint

 import java.awt.*; import javax.swing.*; /** @see https://stackoverflow.com/questions/2846497 */ public class ScrollPanePaint extends JFrame { private static final int TILE = 64; public ScrollPanePaint() { JViewport viewport = new MyViewport(); viewport.setView(new MyPanel()); JScrollPane scrollPane = new JScrollPane(); scrollPane.setViewport(viewport); this.add(scrollPane); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } private static class MyViewport extends JViewport { public MyViewport() { this.setOpaque(false); this.setPreferredSize(new Dimension(6 * TILE, 6 * TILE)); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.blue); g.fillRect(TILE, TILE, 3 * TILE, 3 * TILE); } } private static class MyPanel extends JPanel { public MyPanel() { this.setOpaque(false); this.setPreferredSize(new Dimension(9 * TILE, 9 * TILE)); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.lightGray); int w = this.getWidth() / TILE + 1; int h = this.getHeight() / TILE + 1; for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { if ((row + col) % 2 == 0) { g.fillRect(col * TILE, row * TILE, TILE, TILE); } } } } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new ScrollPanePaint(); } }); } } 

Necesita usar setOpaque(false) para hacerlo transparente. Llámalo tanto en JScrollPane, como en ViewPort.

 sp.setOpaque (falso);
 sp.getViewport (). setOpaque (falso);

También deberá llamar a setOpaque(false) en JTextArea, si también desea que sea transparente.

Código para fondo transparente JScrollpane.

  JScrollPane scrollPane = new JScrollPane(); JViewport viewport = new JViewport(); //Component that need to be added in Scroll pane// viewport.setView(new JPanel()); viewport.setOpaque(false); scrollPane.setViewport(viewport); scrollPane.getViewport().setOpaque(false); scrollPane.setOpaque(false); // Add Scrollpane to Jframe or JPanel// add( scrollPane,BorderLayout.CENTER);