2012-09-17 56 views
8

Tengo un campo de búsqueda en un JPanel. El JPanel tiene una imagen de fondo. Quiero colocar un JTextField en este panel, pero el JTextField debe tener un borde transparente, por lo que tiene un relleno en la parte superior e inferior donde debería ver la imagen de fondo del panel.Borde transparente de JTextField en Swing

Tengo un SSCCE aquí, donde el panel tiene un fondo azul en lugar de una imagen de fondo. Quiero que el campo de texto sea blanco, pero con un borde alrededor, que te permite ver el panel azul debajo de él. Un borde transparente sería genial, pero EmptyBorder no funciona. Aquí está el SSCCE:

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class TransparentBorder 
{ 

    public TransparentBorder() 
    { 
     //Create and set up the window. 
     final JFrame frame = new JFrame("Transparent Border"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 100); 

     // set window size 
     frame.setUndecorated(false); 

     //P1 
     final JPanel panel = new JPanel(new BorderLayout()); 
     panel.setBackground(Color.BLUE); 

     final JButton btn = new JButton("Search"); 
     btn.setOpaque(false); 
     panel.add(btn, BorderLayout.EAST); 

     final JTextField field = new JTextField(); 

     field.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     //  field.setOpaque(false); 
     panel.add(field); 

     frame.add(panel); 
     //Display the window. 
     //  frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(final String[] args) 
    { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TransparentBorder(); 
      } 
     }); 
    } 
} 

muchas gracias.


Gracias por su respuesta Guillaume. Mi JTextfield está dentro de un JPanel con Borderlayout pero la parte NORTE y SOUTH no estaban ocupadas. Así que utilicé Box.createVerticalStrut (10) y lo agregué a NORTH y SOUTH. Esto también funcionó para mí. Pero tengo en mente su sugerencia, por lo que tengo otra solución en caso de que use NORTH y SOUTH para otros componentes.

+2

+1 por publicar un SSCCE :) – Sujay

Respuesta

8

El problema es que TextUI pinta automáticamente todo el fondo del campo de texto, incluidas las inserciones, si se establece en opaco (que es el valor predeterminado).

Un truco simple es envolver su campo de texto en otro JPanel, configurar que JPanel sea no opaco y establecer el borde en ese JPanel.

Su código actualizado con esas informaciones:

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class TransparentBorder { 

    public TransparentBorder() { 
     // Create and set up the window. 
     final JFrame frame = new JFrame("Transparent Border"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 100); 

     // set window size 
     frame.setUndecorated(false); 

     // P1 
     final JPanel panel = new JPanel(new BorderLayout()); 
     panel.setBackground(Color.BLUE); 

     final JButton btn = new JButton("Search"); 
     btn.setOpaque(false); 
     panel.add(btn, BorderLayout.EAST); 
     JPanel wrappingPanel = new JPanel(new BorderLayout()); 
     wrappingPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     wrappingPanel.setOpaque(false); 
     final JTextField field = new JTextField(); 
     field.setBorder(null); 
     wrappingPanel.add(field); 
     panel.add(wrappingPanel); 

     frame.add(panel); 
     frame.revalidate(); 
     // Display the window. 
     // frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(final String[] args) { 
     // Schedule a job for the event-dispatching thread: 
     // creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TransparentBorder(); 
      } 
     }); 
    } 
} 
+1

1 o deja allí built_in LayoutManager, JTextField debe ser demasiado columnas – mKorbel

Cuestiones relacionadas