2013-01-05 32 views
5

Próbuję utworzyć oddzielną klasę CustomFont, w której mogę zmieniać atrybuty tekstu. Stworzyłem więc nową klasę rozszerzoną Font, a wewnątrz utworzono prywatną klasę rysunku, która rozciąga się na JComponent. Zmieniam kolor i inne cechy czcionki i tekstu w metodzie paintComponent.Zmiana koloru tekstu w języku Java

Problem polega na tym, że metoda nie jest wywoływana. Jestem pewien, że popełniam jakiś błąd.

Oto kod:

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

(niezwiązane, ale należy rozważyć użycie Java konwencje nazewnictwa dla zmiennych, na przykład, 'FontStyle' byłoby' fontStyle'). –

+1

Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). –

+0

+1 do @AndrewThompson i DaveNewton komentarze, to nie jest [SSCCE] (http://sscce.org), ponieważ nie mam pojęcia, jak używasz jego klasy, ale zobacz moją odpowiedź poniżej, aby uzyskać pomoc. –

Odpowiedz

3

Dodawanie do mojego komentarza:

1) dont cześć łańcucha farby wywołując super.XXX realizację paintComponent(..) metody, które należy i powinno to być pierwsza rozmowa w zastąpiona metoda lub inny mógłby wystąpić anomalie:

@Override 
protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Font font = new Font("Serif", Font.BOLD, 15); 
     g.setFont(font); 
     g.setColor(Color.YELLOW); 
     g.drawString(string, 0, 0); 
} 

na powyższym kodzie, należy zauważyć adnotację @Override, więc jestem pewien, że nadpisuję poprawną metodę. A także getX() i getY() został zastąpiony przez 0,0, As getX i getY w odniesieniu do pozycji komponentów, jednak kiedy nazywamy drawString, dostarczamy mu informacje o tym, gdzie można narysować w pojemniku (i musi znajdować się w granicach/rozmiar f . pojemnik oczywiście

2) należy zastąpić getPreferredSize podczas rysowania grafiki do obiektu, oraz powrócenia Dimension S, które pasują elementami rysunków/zawartość albo wizualnie tam przyzwyczajenie się nic widocznego jako wielkości komponentów będzie 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) 
    } 
} 

I podobnie jak sugestia użyj pewnej liczby RenderHints i Graphics2D dla estetyzacja tekstu :) Zobacz tutaj więcej:

1

Dużo w tym CustomFont klasie, która tak naprawdę nie żadnego sensu. Po pierwsze, brak czegokolwiek, co można zrobić za pomocą Czcionki, a po drugie fakt, że tak naprawdę nie używa się w niej niczego zakodowanego. Następujące wydaje się być bardziej zgodne z tym, czego szukasz.

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); 
    } 
} 

Do użycia, jak pokazano poniżej ...

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); 
    } 
} 

Drawing korzysta z Font, czcionka nie skorzystać z Drawing. To naprawdę nie ma sensu, aby zdefiniować Drawing zdefiniowane wewnątrz Font.

+0

Proszę wyjaśnić, co mówisz .. – Alfred

+0

to jak mogę to naprawić? – Alfred

+0

W pierwszej części spróbuj draw.setSize (int w, int h) i sprawdź, czy to pomaga. Możesz także sprawdzić, czy ma on niezerowy rozmiar, drukując draw.getSize() na konsolę. Dla drugiej części, nie chcesz używać getX() i getY() w g.drawString(). drawString już rysuje w stosunku do pozycji komponentu. Potrzebujesz wartości x pomiędzy 0 a getWidth() i wartości y między 0 a getHeight(). – Mike