2010-12-30 10 views
7

setBorder 메소드 내에서 Text1 및 Text2 텍스트에 대해 내 자신의 글꼴 및 색상 구성표를 정의 할 수있는 방법이 있나요? . java를 처음 사용하며 SUN 튜토리얼에서 찾을 수 없습니다.Java - setBorder의 글꼴/색상

같은TitledBorder에서 당신은 문자열의 각 (예를 들어 Text1Text2)에 대한 다른 글꼴과 색상을 원하는 경우 사이먼

+1

이 (['API']를 참조하십시오 http://download.oracle.com/javase/6/docs/api/ javax/swing/BorderFactory.html) –

답변

3

내 코드

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

감사합니다, 당신은 할 수있다 AbstractBorder을 확장하고 paintBorder()을 재정의해야합니다. 기존의 구현은 하나의 제목에 대해 하나의 글꼴과 하나의 색상만을 가지고 있습니다.

+0

답장을 보내 주셔서 감사합니다. – Simon

0

Java 및 Swing을 처음 사용하는 경우이 작업을 수행하는 JavaDocs는 다소 압도적입니다. BorderFactory에서의 JavaDoc을 현재 위치 : http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/BorderFactory.html

가 여기 산세 리프 글꼴에서 텍스트 빨간색을의 예 :

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

나는 그것이 오래된 질문 알고있다. 생각해 보겠습니다. 누군가이 문제를 해결하는 방법을 알고 있을지 모르겠지만 그것을 부활시키고 싶습니다. 나는 '부분적인 해결책'만을 가지고있다.

나는 아주 빨리 원하는대로하는 테두리를 구현했습니다. 자바가 제공하는 것, 즉 스윙 구성 요소의 HTML 해석을 재사용했습니다.

모든 작업이 멋지지만 텍스트의 글꼴 크기가 다른 경우를 제외하고는 테두리가 일반 텍스트 나 HTML 텍스트에 잘 그려집니다.

이 문제를 해결하는 방법을 모르겠습니다. 그러나 나는 해결책에 관심이 많다.

textLengthInPixels 변수를 계산할 때 프로 시저가 자체 글꼴 크기로 각 문자열의 너비를 합한 것임을 알고 있습니다.

문제는입니다.보기에서 가져온 방법은 모르겠지만 어떨까요?



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

이 시도 :

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

그것이 효과가 있었고, 항상 나를 위해 일했습니다. – sabbibJAVA

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

첫 번째 매개 변수 null 또는 (화합물 테두리에 대한) 또 다른 국경 당신의 3, 4 PARAM의 정당성과 위치를 표시하고 2 PARAM 텍스트 매개 변수 2의 텍스트

네 번째 매개 변수 및 다섯 번째 매개 변수는 글꼴 및 색을 설정하는 두 가지입니다

1

텍스트 글꼴 :

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

텍스트 색 :

((javax.swing.border.TitledBorder)panel_1.getBorder()).setTitleColor(Color.WHITE); 
관련 문제