2010-12-30 22 views
7

Text1とText2のテキストに対して独自のフォントとカラースキームを定義できる方法はありますか? setBorderメソッド内にあります。 javaを初めて使用し、SUNチュートリアルで見つけることができません。Javaでフォントを設定する/ setBorderの色

私のコード

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

よろしく サイモン

+1

[ 'API'](http://download.oracle.com/javase/6/docs/api/を参照してくださいjavax/swing/BorderFactory.html) –

答えて

3

あなたは同じTitledBorder内の文字列のそれぞれについて、異なるフォントや色(例えばText1Text2を)したい場合は、可能AbstractBorderを拡張し、paintBorder()を上書きする必要があります。既存の実装は、1つのタイトルに対して1つのフォントと1つの色しか持たない。

+0

お返事ありがとうございました。 – Simon

0

これを行うためのJavaDocsは、あなたがJavaとSwingを初めて使う人にとっては圧倒的です。 BorderFactoryのJavadocはここにある:http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/BorderFactory.html

はここ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

私はそれが古い質問です知っています。 この問題を解決する方法を誰かが知っているかもしれないので、私はそれを復活させたいと思います。私には「部分的な解決策」しかありません。

私は非常にすぐにあなたが望むことを行う境界線を実装しています。 Javaが提供するもの、つまりスイングコンポーネントの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正当化と場所を表示してい 第二のparamテキストパラメータ2からのテキスト

4番目のパラメータ と5番目のパラメータは、フォントと色を設定する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); 
関連する問題