2010-12-30 8 views
7

Gibt es eine Möglichkeit, meine eigenen Schriftart und Farbschemata für Text1 UND Text2 Text innerhalb der SetBorder-Methode zu definieren. Neu in Java und kann es nicht in den SUN-Tutorials finden.Java - Einstellung Schriftarten/Farbe in setBorder

Mein Code

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

Grüße Simon

+1

Bitte beachten Sie [ 'API'] (http://download.oracle.com/javase/6/docs/api/ javax/swing/BorderFactory.html) –

Antwort

3

Wenn Sie eine verschiedenen Schriftart und Farbe für jede der Saiten (zB Text1 und Text2) in der Sie gleichenTitledBorder, möchten müssen AbstractBorder zu verlängern und paintBorder() überschreiben. Die vorhandene Implementierung hat nur eine Schriftart und eine Farbe für einen einzelnen Titel.

+0

Okay vielen Dank für Ihre Antworten. – Simon

0

Die JavaDocs dafür sind etwas überwältigend, wenn Sie neu in Java und Swing sind. Die JavaDocs für BorderFactory sind hier: http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/BorderFactory.html

Hier ist ein Beispiel zur Herstellung des Text in einer roten serifenlosen Schrift:

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

Ich weiß, es eine alte Frage. Dachte, ich möchte es wieder aufleben lassen, da vielleicht jemand weiß, wie man dieses Problem löst. Ich habe nur eine Teillösung.

Ich habe sehr schnell die Grenze implementiert, die das tut, was Sie wollen. Ich habe wiederverwendet, was Java gibt, d. H. Interpretation von HTML in Schwungkomponenten.

Alles funktioniert süß, die Grenze ist für einen einfachen oder HTML-Text gut gemalt, mit Ausnahme für eine Situation, wo Sie versuchen, verschiedene Schriftgrößen für die Texte zu haben.

Ich habe keine Idee, wie Sie dieses Problem lösen. Aber ich bin sehr an einer Lösung interessiert.

Ich weiß, die Prozedur wäre die Breite jedes Strings in seiner eigenen Schriftgröße zusammenzufassen, wenn die Variable textLengthInPixels berechnet wird.

Das Problem ist, dass ich nicht weiß, wie man es bekommt, vielleicht aus der Sicht, aber keine Ahnung, wie?



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

Versuchen Sie folgendes:

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

hat es funktioniert, hat für mich immer funktioniert – sabbibJAVA

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

der erste Parameter null oder eine andere Grenze (für Verbindung Grenzen) 2. param Text, den Sie 3. und 4. param Rechtfertigung und Lage sind die Anzeige von der text von param 2

4. param und 5. param sind die zwei, um schrift und farbe

1

Text Font:

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

Textfarbe:

((javax.swing.border.TitledBorder)panel_1.getBorder()).setTitleColor(Color.WHITE); 
Verwandte Themen