2012-09-17 22 views
8

JPanelに検索フィールドがあります。 JPanelには背景画像があります。私はこのパネルにJTextFieldを配置したいが、JTextFieldは透明な境界線を持つ必要があるため、パネルの背景イメージが表示されるはずの上下にいくつかのパディングがあります。SwingのJTextFieldの透明な境界

ここには、パネルに背景イメージではなく青い背景があるSSCCEがあります。私はテキストフィールドを白くしたいが、その周りに境界線があるので、その下の青いパネルを見てみよう。透明なボーダーは素晴らしいですが、EmptyBorderは機能しません。ここに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(); 
      } 
     }); 
    } 
} 

ありがとうございます。


回答ありがとうございますギヨーム。私のJTextfieldはBorderlayoutを持つJPanelの中​​にありますが、NORTHとSOUTHの部分は占有されていません。だから私はBox.createVerticalStrut(10)を使ってNORTHとSOUTHに追加しました。これも私のために働いた。しかし私はあなたの提案を念頭に置いているので、他のコンポーネントのためにNORTHとSOUTHを使用する場合には別の解決策があります。

+2

1 SSCCEを投稿するため:) – Sujay

答えて

8

TextSetは、インセットを含むテキストフィールドの背景全体を、不透明(デフォルト)に設定すると自動的にペイントします。

単純なトリックは、テキストフィールドを別のJPanelにラップし、JPanelを非不透明に設定し、そのJPanelで境界線を設定することです。

あなたのコードは、それらに関する情報を更新:

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またはLayoutManagerのBUILT_INができ、JTextFieldがあまりに列でなければなりません – mKorbel

関連する問題