2013-01-05 9 views
5

텍스트 속성이 다른 별도의 CustomFont 클래스를 만들려고합니다. 그래서 나는 Font 확장 된 새로운 클래스를 만들고 내부는 JComponent을 확장하는 개인 클래스 드로잉을 만들었습니다. paintComponent 방법 안에 글꼴과 원본의 색깔 그리고 다른 특성을 바꾸십시오.자바에서 텍스트 색상 변경

문제는 paintComponent 메서드가 호출되지 않습니다. 나는 실수를하고 있다고 확신한다.

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

(관련없는,하지만 예를 들어,'FontStyle'는'fontStyle' 것, 자바 변수에 대한 명명 규칙을 사용하는 것이 좋습니다.) :찾고 좋은 텍스트 Graphics2D : 더 여기를 참조하십시오 –

+1

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

@AndrewThompson과 DaveNewton의 +1에 대한 +1은 그의 수업을 어떻게 사용하고 있는지 알지 못하기 때문에 [SSCCE] (http://sscce.org)가 아니지만 아래에서 내 도움이 필요합니다. –

답변

3

내 댓글에 추가

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

위의 코드에 @Override 주석이 표시되어 있으므로 올바른 방법을 재정의 할 수 있습니다. 또한 getX()getY()은 0,0으로 대체되었으므로, drawString을 호출 할 때 구성 요소 위치라고하는 getXgetY을 컨테이너에 그릴 위치의 매개 변수를 제공합니다 (범위/크기 f 내에 있어야 함). . 물론 용기

2) 그래픽 객체로 그릴 때 getPreferredSize을 무시하고 구성 요소의 크기로 볼 수 아무것도 당신의 구성 요소 도면/내용에 맞게 또는 다른 시각이있을 실 거예요 Dimension의 반환해야 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) 
    } 
} 

마찬가지로 제안으로 일부 012를 사용합니다.

1

정말 이해가되지 않습니다이 CustomFont 클래스에 많이있다 : 여기

는 코드입니다. 하나는 글꼴로 실제로 할 수있는 것이 부족하다는 것, 다른 하나는 글꼴로 코딩 된 것을 실제로 사용하지 않는다는 것입니다. 다음은 당신이 찾고있는 라인에 따라 더 많은 것 같습니다. 아래 그림과 같이

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

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

그리기가 Font를 사용합니다 ... 사용하려면 글꼴은 Drawing를 사용하지 않습니다. 안에 Drawing이 정의 된 것은 사실이 아닙니다. 당신이 그것을 오버라이드 (override) 된 메소드 또는 다른 이상이 발생할 수있는 첫 번째 호출해야한다 paintComponent(..) 방법의 super.XXX 구현을 호출하여

1) 당신은 페인트 체인을 존중 해달라고 :

+0

제발 당신이 말하고있는 것을 정교하게 만들 수 있습니다. – Alfred

+0

그러면 어떻게 해결할 수 있습니까? – Alfred

+0

첫 번째 부분에서는 draw.setSize (int w, int h)를 사용하여 도움이되는지 확인하십시오. draw.getSize()를 콘솔에 출력하여 크기가 0이 아닌지 확인할 수도 있습니다. 두 번째 부분에서는 g.drawString()에서 getX() 및 getY()를 사용하지 않을 것입니다. drawString은 이미 구성 요소의 위치를 ​​기준으로 그립니다. 0과 getWidth() 사이의 x 값과 0과 getHeight() 사이의 y 값이 필요합니다. – Mike