2012-09-17 91 views
8

Tôi có một trường tìm kiếm trong một JPanel. JPanel có hình nền. Tôi muốn đặt một JTextField trong bảng điều khiển này, nhưng JTextField nên có một biên giới tranparent, do đó, nó có một số padding để trên cùng và dưới cùng, nơi bạn sẽ thấy hình nền của bảng điều khiển.Đường viền trong suốt của JTextField trong Swing

Tôi có SSCCE tại đây, nơi bảng điều khiển có nền màu xanh thay vì hình nền. Tôi muốn textfield có màu trắng, nhưng với một đường viền xung quanh nó, bạn sẽ thấy bảng màu xanh bên dưới nó. Một đường viền trong suốt sẽ rất tuyệt, nhưng EmptyBorder không hoạt động. Đây 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(); 
      } 
     }); 
    } 
} 

cảm ơn rất nhiều.


Cảm ơn câu trả lời của bạn Guillaume. JTextfield của tôi nằm bên trong một JPanel với Borderlayout nhưng phần NORTH và SOUTH không bị chiếm đóng. Vì vậy, tôi đã sử dụng Box.createVerticalStrut (10) và thêm nó vào NORTH và SOUTH. Điều này cũng làm việc cho tôi. Nhưng tôi giữ ý kiến ​​của bạn trong tâm trí, vì vậy tôi có một giải pháp trong trường hợp tôi sử dụng NORTH và SOUTH cho các thành phần khác.

+2

+1 cho đăng một SSCCE :) – Sujay

Trả lời

8

Vấn đề là TextUI tự động vẽ toàn bộ nền của trường văn bản, bao gồm cả insets, nếu nó được đặt thành mờ (là mặc định).

Một mẹo đơn giản là bao bọc trường văn bản của bạn trong một JPanel khác, đặt JPanel thành không mờ đục và đặt đường viền trên JPanel đó.

Mã của bạn được cập nhật với những infos:

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 hoặc cho phép có built_in LayoutManager, JTextField nên cột quá – mKorbel

Các vấn đề liên quan