2013-01-05 38 views
5

Sto tentando di creare una classe separata CustomFont in cui sono disponibili diversi attributi di testo. Così ho creato una nuova classe estesa Font e all'interno ho creato una classe privata Drawing che estende JComponent. Cambio il colore e altre caratteristiche del font e del testo all'interno del metodo paintComponent.Modifica del colore del testo in Java

Il problema è paintComponent il metodo non viene chiamato. Sono sicuro che sto facendo un errore.

Ecco il codice:

import javax.swing.JComponent; 

public class CustomFont extends Font { 
    private String string; 
    private int FontStyle; 

    public CustomFont(String text, int style) { 
     super("Serif", style, 15); 
     FontStyle = style; 
     string = text; 

     Drawing draw = new Drawing(); 
     draw.repaint(); 
    } 

    private class Drawing extends JComponent { 
     public void paintComponent(Graphics g) { 
      Font font = new Font("Serif", Font.BOLD, 15); 
      g.setFont(font); 
      g.setColor(Color.YELLOW); 
      g.drawString(string, getX(), getY()); 
     } 
    } 
} 
+1

(non collegati, ma considerare l'utilizzo di Java convenzioni di denominazione per le variabili, per esempio, 'FontStyle' sarebbe' fontStyle'.) –

+1

Per un aiuto migliore, pubblicare un [SSCCE] (http://sscce.org/). –

+0

+1 ai commenti @AndrewThompson e DaveNewton, questo non è un [SSCCE] (http://sscce.org) poiché non ho idea di come stai usando la sua classe, ma vedi la mia risposta qui sotto per un aiuto. –

risposta

3

Aggiunta al mio commento:

1) tu non onorare la catena vernice chiamando super.XXX attuazione paintComponent(..) metodo che si dovrebbe e dovrebbe essere la prima chiamata nel metodo override, altrimenti potrebbero verificarsi anomalie:

nella nota di codice sopra l'annotazione @Override quindi sono sicuro che sto ignorando il metodo corretto. E anche getX() e getY() sono stati sostituiti con 0,0, come getX e getY riferiti alla posizione dei componenti, tuttavia quando chiamiamo drawString forniamo con i parametri di dove disegnare all'interno del contenitore (e deve essere all'interno dei limiti/dimensione f . contenitore naturalmente

2) si dovrebbe ignorare getPreferredSize in sede di elaborazione di oggetto Graphics e tornare Dimension s che si adattano ai componenti disegni/contenuti oppure visivamente non ci sarà nulla di visibile come dimensioni componenti saranno 0,0:

private class Drawing extends JComponent { 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200);//you would infact caluclate text size using FontMetrics#getStringWidth(String s) 
    } 
} 

E come suggerimento usare un po 'di RenderHints e Graphics2D per il testo nice looking :) Vedi qui per più:

1

C'è molto in questo CustomFont classe che in realtà non ha alcun senso. Per uno, la mancanza di qualsiasi cosa per fare effettivamente con un font, per un altro il fatto che in realtà non si usa niente di codice. Quello che segue sembra essere più simile a quello che stai cercando.

public class Drawing extends JComponent { 
    String text; 
    Font myFont; 
    Color myTextColor; 

    public Drawing(String textArg, Font f, Color textColor) { 
     myFont = f; 
     myTextColor = textColor; 
     text = textArg; 
    } 

    public void paintComponent(Graphics g) { 
     g.setFont(myFont); 
     g.setColor(myTextColor); 
     g.drawString(text, 0, getHeight()/2); 
    } 
} 

Per essere usato come mostrato di seguito ...

public class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Font font = new Font("Serif", Font.BOLD, 15); 
     String text = "blah blah blah"; 
     Color textColor = Color.YELLOW; 
     Drawing d = new Drawing(text, font, textColor); 

     frame.add(d); 
     frame.setSize(100,100); 
     frame.setVisible(true); 
    } 
} 

Disegno fa uso di un Font, un carattere non fa uso di un Drawing. Non ha davvero senso avere Drawing definito all'interno di un Font.

+0

Si prega di elaborare quello che stai dicendo .. – Alfred

+0

quindi come posso risolvere questo? – Alfred

+0

Per la prima parte, prova a disegn.setSize (int w, int h) e vedi se questo aiuta. È inoltre possibile verificare se ha una dimensione diversa da zero stampando draw.getSize() sulla console. Per la seconda parte, non si desidera utilizzare getX() e getY() in g.drawString(). drawString disegna già relativamente alla posizione del componente. È necessario un valore x compreso tra 0 e getWidth() e un valore y compreso tra 0 e getHeight(). – Mike

Problemi correlati