2012-09-17 13 views
8

Ho un campo di ricerca in un JPanel. JPanel ha un'immagine di sfondo. Voglio posizionare un JTextField in questo pannello, ma il JTextField dovrebbe avere un bordo tranparent, quindi ha del padding in alto e in basso dove dovresti vedere l'immagine di sfondo del pannello.Bordo trasparente di JTextField in Swing

Ho un SSCCE qui, dove il pannello ha uno sfondo blu invece di un'immagine di sfondo. Voglio che il campo di testo sia bianco, ma con un bordo intorno, che ti permette di vedere il pannello blu sotto di esso. Un bordo trasparente sarebbe fantastico, ma EmptyBorder non funziona. Ecco l'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(); 
      } 
     }); 
    } 
} 

Thanks a lot.


Grazie per la vostra risposta Guillaume. Il mio JTextfield è all'interno di un JPanel con Borderlayout ma la parte NORD e SUD non era occupata. Quindi ho usato Box.createVerticalStrut (10) e l'ho aggiunto a NORD e SUD. Questo ha funzionato anche per me. Ma tengo a mente il tuo suggerimento, quindi ho un'altra soluzione nel caso io usi il NORD e il SUD per altri componenti.

+2

+1 per la pubblicazione di uno SSCCE :) – Sujay

risposta

8

Il problema è che TextUI dipinge automaticamente tutto lo sfondo del campo di testo, inclusi gli inset, se è impostato su opaco (che è l'impostazione predefinita).

Un semplice trucco è quello di avvolgere il tuo campo di testo in un altro JPanel, impostare che JPanel sia non-opaco e impostare il bordo su quel JPanel.

Il codice aggiornato con queste informazioni:

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 lascia lì built_in LayoutManager, JTextField dovrebbe essere troppo colonne – mKorbel

Problemi correlati