2010-12-30 29 views
7

¿Hay alguna manera de definir mis propias combinaciones de fuentes y colores para Text1 y Text2? dentro del método setBorder. Nuevo en java y no puede encontrarlo en los tutoriales de SUN.Java - configuración de fuentes/color en setBorder

Mi código

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

Saludos Simon

+1

favor refiérase a [ 'API'] (http://download.oracle.com/javase/6/docs/api/ javax/swing/BorderFactory.html) –

Respuesta

3

Si quieres un fuente diferente y color para cada una de las cadenas (por ejemplo Text1 y Text2) en el mismaTitledBorder, es posible Se debe ampliar AbstractBorder y anular paintBorder(). La implementación existente solo tiene una fuente y un color para un solo título.

+0

Bien, gracias a todos por sus respuestas. – Simon

0

Los JavaDocs para hacer esto son algo abrumadores si eres nuevo en Java y Swing. Los JavaDocs para BorderFactory están aquí: http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/BorderFactory.html

He aquí un ejemplo de hacer el rojo texto en una fuente de 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

Sé que es una vieja cuestión. Pensé que me gustaría resucitarlo, ya que tal vez alguien sepa cómo resolver este problema. Solo tengo 'una solución parcial'.

Implementé rápidamente el borde que hace lo que desea. He reutilizado lo que Java ofrece, es decir, la interpretación de HTML en componentes swing.

Todo funciona bien, el borde está bien pintado para un texto plano o HTML, con excepción de una situación en la que intenta tener diferentes tamaños de fuente para los textos.

No tengo idea de cómo resolver este problema. Pero estoy muy interesado en una solución.

Sé que el procedimiento sería resumir el ancho de cada cadena en su propio tamaño de letra al calcular la variable textLengthInPixels.

El problema es que no sé cómo conseguirlo, tal vez desde la Vista, pero ¿cómo?



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

Prueba esto:

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

funcionó, trabajó para mí siempre tiene – sabbibJAVA

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

el primer parámetro nulo u otra frontera (por bordes compuestos) segundo parámetro de texto que se esté viendo 3 y 4 de la justificación y la ubicación del parámetro el texto del parámetro 2

4 ° parametro y 5 ° param son los dos para establecer la fuente y el color

1

fuente de texto:

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

Color del texto:

((javax.swing.border.TitledBorder)panel_1.getBorder()).setTitleColor(Color.WHITE); 
Cuestiones relacionadas