2010-12-30 71 views
7

Có cách nào tôi có thể xác định phông chữ và bảng phối màu của riêng mình cho văn bản 1 và văn bản text2 trong phương thức setBorder. Mới với java và không thể tìm thấy nó trong hướng dẫn SUN.Java - thiết lập Phông chữ/Màu sắc trong setBorder

Mã của tôi

//Create Positions Table 
JPanel SpreadPanel = new JPanel(); 
SpreadPanel.setBorder(BorderFactory.createTitledBorder(" Text 1 Text 2")); 

Trân Simon

+1

Vui lòng tham khảo [ 'API'] (http://download.oracle.com/javase/6/docs/api/ javax/swing/BorderFactory.html) –

Trả lời

3

Nếu bạn muốn có một khác nhau phông chữ và màu sắc cho mỗi chuỗi (ví dụ Text1Text2) trong cùngTitledBorder, bạn có thể cần phải gia hạn AbstractBorder và ghi đè paintBorder(). Việc triển khai hiện tại chỉ có một phông chữ và một màu cho một tiêu đề duy nhất.

+0

Ok cảm ơn tất cả các bạn đã trả lời. – Simon

0

JavaDocs để thực hiện việc này có phần hơi áp đảo nếu bạn mới sử dụng Java và Swing. JavaDocs cho BorderFactory đang ở đây: http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/BorderFactory.html

Dưới đây là một ví dụ về làm cho đỏ văn bản trong một phông chữ sans serif:

import javax.swing.*; 
import javax.swing.border.TitledBorder; 
import java.awt.*; 
import java.io.IOException; 

public class ScratchSpace { 

    public static void main(String[] args) throws IOException { 
     Font myFont = new Font("SansSerif", Font.PLAIN, 10); 
     Color myColor = Color.RED; 
     TitledBorder titledBorder = BorderFactory.createTitledBorder(null, " Text 1 Text 2", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, myFont, myColor); 
     JFrame frame = new JFrame(); 
     final JLabel label = new JLabel("Hello gruel world"); 
     label.setBorder(titledBorder); 
     frame.getContentPane().add(label); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
0

Tôi biết đó là một câu hỏi cũ. Tôi nghĩ rằng tôi muốn hồi sinh nó như có thể ai đó biết cách giải quyết vấn đề này. Tôi chỉ có 'một giải pháp một phần'.

Tôi đã nhanh chóng triển khai biên giới thực hiện những gì bạn muốn. Tôi đã tái sử dụng những gì Java đưa ra, tức là giải thích HTML trong các thành phần swing.

Tất cả các công trình ngọt ngào, đường viền được tô mịn cho văn bản thuần hoặc HTML, ngoại trừ trường hợp bạn đang cố gắng có kích thước phông chữ khác nhau cho văn bản.

Tôi không biết cách giải quyết vấn đề này. Nhưng tôi rất quan tâm đến một giải pháp.

Tôi biết quy trình sẽ tổng hợp chiều rộng của mỗi chuỗi theo kích thước phông chữ của riêng nó khi tính toán biến textLengthInPixels.

Vấn đề là mà tôi không biết cách tải xuống, có thể từ Chế độ xem, nhưng không biết làm cách nào?



import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.AbstractBorder; 
import javax.swing.border.Border; 
import javax.swing.border.LineBorder; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.View; 

public class MultiColorTitleBorder extends AbstractBorder 
{ 
    private static final long serialVersionUID = 1L; 
    private JLabel label; 
    private int thicknessTop = 10; 
    private Border border; 
    private int thicknessLeft = 0; 
    private int thicknessRight = 0; 
    private int thicknessBottom = 0; 

    public MultiColorTitleBorder(String title) 
    { 
     this.label = new JLabel(title); 
     thicknessTop = label.getPreferredSize().height; 
    } 

    public MultiColorTitleBorder(String title, Border border) 
    { 
     this(title); 
     this.border = border; 
     thicknessLeft = border.getBorderInsets(null).left; 
     thicknessRight = border.getBorderInsets(null).right; 
     thicknessBottom = border.getBorderInsets(null).bottom; 
    } 

    @Override 
    public synchronized void paintBorder(Component c, Graphics g, int x, int y, int width, int height) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     View view = (View) label.getClientProperty("html"); 
     String text = label.getText(); 
     FontMetrics fm = g2.getFontMetrics(label.getFont()); 
     int bY = y + fm.getAscent() - ((fm.getAscent() + fm.getDescent()))/2; 

     if(border != null) 
     { 
      Insets in = border.getBorderInsets(c); 
      g2.setClip(x, y, thicknessLeft * 2, height); 
      border.paintBorder(c, g, x, bY, width, height - bY); 
      try 
      { 
       if(view != null) 
        text = view.getDocument().getText(0, view.getDocument().getLength()); 
      }catch(BadLocationException ex) 
      { 
       Logger.getLogger(MultiColorTitleBorder.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      int textLengthInPixels = fm.stringWidth(text); 
      System.out.println("textLengthInPixels=" + textLengthInPixels); 
      g2.setClip(x +thicknessLeft * 2+ textLengthInPixels, y, width - thicknessLeft * 2 -textLengthInPixels, height); 
      border.paintBorder(c, g, x, bY, width, height - bY); 
      int bottomIn = in.bottom; 
      g2.setClip(x, height - bottomIn, width, bottomIn); 
      border.paintBorder(c, g, x, bY, width, height - bY); 
      g2.setClip(x, y, width, height); 
     } 
     if(view != null) 
      view.paint(g2, new Rectangle(x + thicknessLeft * 2, y, width - thicknessLeft * 2, height)); 
     else 
     { 
      Font prevFont = g2.getFont(); 
      g2.setFont(label.getFont()); 
      g2.drawString(text, x + thicknessLeft * 2, fm.getAscent()); 
      g2.setFont(prevFont); 
     } 
    } 

    @Override 
    public Insets getBorderInsets(Component c) 
    { 
     return new Insets(thicknessTop, thicknessLeft, thicknessBottom, thicknessRight); 
    } 

    @Override 
    public Insets getBorderInsets(Component c, Insets insets) 
    { 
     insets.top = thicknessTop; 
     insets.left = thicknessLeft; 
     insets.right = thicknessRight; 
     insets.bottom = thicknessBottom; 
     return insets; 
    } 

    @Override 
    public boolean isBorderOpaque() 
    { 
     return false; 
    } 

    public static void main(String[] args) 
    { 
     JPanel p = new JPanel(); 
     p.setPreferredSize(new Dimension(200, 200)); 
     String title = "<html><color=red> Text 1</font><font color=blue>      Text 2</font>"; 
     //title = "<html><font color=red font size=5> Text 1</font><font color=blue>      Text 2</font>"; 
     //title = "Text 1 Text 2"; 

     p.setBorder(new MultiColorTitleBorder(title, new LineBorder(Color.CYAN, 6))); 
     p.setBackground(Color.YELLOW); 
     p.add(new JTextField(5)); 
     JPanel contentPane = new JPanel(); 
     contentPane.add(p); 
     JFrame f = new JFrame(); 
     f.setContentPane(contentPane); 
     f.setSize(800, 600); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 
} 

0

Hãy thử điều này:

.setBorder(UIManager.getBorder("TextField.border")); 
+1

đã làm việc, làm việc cho tôi luôn luôn có – sabbibJAVA

4
setBorder(BorderFactory.createTitledBorder(null, "text", TitledBorder.CENTER, TitledBorder.BOTTOM, new Font("times new roman",Font.PLAIN,12), Color.yellow)); 

tham số đầu tiên null hoặc biên giới khác (ví biên giới hợp chất) 2 văn bản param rằng bạn đang hiển thị 3 và 4 biện minh param và vị trí của văn bản từ thông số 2

Tham số thứ tư và thông số thứ 5 là hai để đặt phông chữ và màu

1

Text Font:

((javax.swing.border.TitledBorder) panel_1.getBorder()).setTitleFont(new Font("Tahoma", Font.PLAIN, 20)); 

Màu Chữ:

((javax.swing.border.TitledBorder)panel_1.getBorder()).setTitleColor(Color.WHITE); 
Các vấn đề liên quan