2014-04-15 2 views
0

셰이프를 뒤죽박죽으로 사용할 때 문제가 발생했습니다. 호의 크기를 조작하는 슬라이더로 간단한 프로그램을 만들었습니다. 문제는 내가 실행할 때 호가 화면에 그려지지 않는다는 것입니다. 그러나 슬라이더의 값을 변경하면 모든 것이 완벽하게 작동하기 시작합니다. 이것이 무엇에 의한 것인지에 대한 생각은? 여기 코드는 다음과 같습니다사용자 지정 구성 요소가 처음에는 보이지 않지만 표시 될 수 있습니다.

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.event.ChangeListener; 
import javax.swing.event.ChangeEvent; 
import java.awt.*; 
import java.awt.geom.*; 
@SuppressWarnings("serial") 
public class GraphicsTest2 extends JFrame implements ChangeListener { // START OF GraphicsTest2 
    private JPanel sliderPanel, thePanel; 
    private JSlider slider; 
    private DrawStuff draw; 
    public static void main(String[] args) { // START OF main 
     new GraphicsTest2(); 
    } // END OF main 
    public GraphicsTest2() { // START OF CONSTRUCTOR 
     super("Graphics test 2"); 
     this.setSize(500, 500); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     thePanel = new JPanel(); 
     thePanel.setLayout(new BorderLayout(10, 10)); 
     slider = new JSlider(JSlider.HORIZONTAL, 1, 360, 120); 
     slider.addChangeListener(this); 
     sliderPanel = new JPanel(); 
     sliderPanel.add(slider, BorderLayout.CENTER); 
     draw = new DrawStuff(); 
     thePanel.add(sliderPanel, BorderLayout.SOUTH); 
     thePanel.add(draw, BorderLayout.CENTER); 
     this.add(thePanel, BorderLayout.CENTER); 
     this.pack(); 
     this.validate(); 
     this.setVisible(true); 
    } // END OF CONSTRUCTOR 
    public void stateChanged(ChangeEvent e) { // START OF stateChanged 
     if(e.getSource() == slider) { 
      int size = slider.getValue(); 
      draw.arc = new Arc2D.Double(draw.getWidth()/2 - 50, draw.getHeight()/2 - 50, 100, 100, 0, size, Arc2D.PIE); 
      this.repaint(); 
     } 
    } // END OF stateChanged 
    private class DrawStuff extends JComponent { // START OF DrawStuff 
     Shape arc; 
     public void paintComponent(Graphics g) { // START OF paintComponent 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2.setColor(Color.GREEN); 
      g2.fill(arc); 
     } // END OF paintComponent 
     public DrawStuff() { 
      this.setPreferredSize(new Dimension(100, 140)); 
      arc = new Arc2D.Double(this.getWidth()/2 - 50, this.getHeight()/2 - 50, 100, 100, 0, 120, Arc2D.PIE); 
     } 
    } // END OF DrawStuff 
} // END OF GraphicsTest2 

답변

0

여기 DrawStuff의 생성자에 arc을 만들 때 : 구성 요소가 아직 크기되지 않기 때문에

arc = new Arc2D.Double(this.getWidth()/2 - 50, this.getHeight()/2 - 50, 100, 100, 0, 120, Arc2D.PIE); 

this.getWidth()this.getHeight() 0의 결과를 제공 할 것입니다. 간단한 수정과 같이 고정 된 크기를 사용하는 것입니다 :

arc = new Arc2D.Double(210/2 - 50, 140/2 - 50, 100, 100, 0, 120, Arc2D.PIE); 
+0

덕분에, 지금은이 JComponent에 제대로 –

+2

무시로 getPreferredSize 작업 알았어, 다음 this.setSize (500, 500)을 제거; – mKorbel

+1

@mKorbel 귀하의 의견에 동의해야합니다. –