2013-03-01 2 views
3

세그먼트별로 타이머의 과정에서 완전히 채워진 채워진 원을 사용하여 타이머를 나타내려고합니다. 나는. 4 초 타이머로 1 초마다 원이 채워지면 첫 번째 원에는 1/4 원, 그 다음 절반에는 3/4 초, 마지막으로 완전한 원이 표시됩니다.자바에서 동그라미 조각 그리기?

Java에서 원의 조각을 그리는 방법이 있습니까? 그래픽 API에서 임의의 모양을 살펴 보았습니다. 그러나 이것이 올바른 방향인지 또는 이러한 유형의 모양을 쉽게 생성 할 수있는 언어로 작성된 것이 있는지 확실하지 않습니다.

도움을 주시면 감사하겠습니다.

+5

네, 가능합니다, 그래 Graphics2D의 오른쪽 API는, [Graphics2D의] 한 번 봐 (http://docs.oracle.com/javase/tutorial/2d/geometry/primitives을 .html), 특히 Arc2D 클래스. 또한 javax.swing.Timer를 연구하고 싶습니다. – MadProgrammer

답변

8

예, 가능합니다. 예, Graphics2D가이 작업을 수행 할 수 있습니다.

Drawing Geometric Primitives (Arc2D 섹션 참조)을 살펴보십시오.

진행률을 "애니메이트"하려면 javax.swing.Timer을 사용하는 것이 가장 쉽지만 요구 사항에 따라 SwingWorker을 사용해야 할 수도 있습니다. 자세한 내용은 Currency in SwingHow to use Swing Timers을보십시오.

다음 예는 비교적 간단합니다. 0-100 %의 진행을 가정하고 필요에 따라 호를 생성합니다. Graphics2D 컨텍스트의 색상을 변경하고 draw(Shape)을 사용하여 원의 아웃 라인을 그리는 것이 간단합니다.

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Arc2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ArcProgress { 

    public static void main(String[] args) { 
     new ArcProgress(); 
    } 
    private float progress; 

    public ArcProgress() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       final ArcProgressPane p1 = new ArcProgressPane(); 
       p1.setForeground(Color.RED); 
       final ArcProgressPane p2 = new ArcProgressPane(); 
       p2.setForeground(Color.BLUE); 
       p2.setFillProgress(true); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new FlowLayout()); 
       frame.add(p1); 
       frame.add(p2); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       Timer timer = new Timer(40, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         progress += 0.01f; 
         if (progress >= 1f) { 
          progress = 1f; 
          ((Timer) e.getSource()).stop(); 
         } 
         p1.setProgress(progress); 
         p2.setProgress(progress); 
        } 
       }); 
       timer.setRepeats(true); 
       timer.setCoalesce(true); 
       timer.start(); 

      } 
     }); 
    } 

    public class ArcProgressPane extends JPanel { 

     private boolean fillProgress = false; 
     private float progress; 

     public ArcProgressPane() { 
     } 

     public void setFillProgress(boolean value) { 
      if (fillProgress != value) { 
       this.fillProgress = value; 
       firePropertyChange("fillProgress", !fillProgress, fillProgress); 
      } 
     } 

     public boolean isFillProgress() { 
      return fillProgress; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(100, 100); 
     } 

     public void setProgress(float value) { 
      if (progress != value) { 
       float old = progress; 
       this.progress = value; 
       firePropertyChange("progress", old, progress); 
       repaint(); 
      } 
     } 

     public float getProgress() { 
      return progress; 
     } 

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

      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
      g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
      g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 

      Insets insets = getInsets(); 
      int width = getWidth() - (insets.left + insets.right); 
      int height = getHeight() - (insets.bottom + insets.top); 
      int raidus = Math.min(width, height); 
      int x = insets.left + ((width - raidus)/2); 
      int y = insets.right + ((height - raidus)/2); 

      double extent = 360d * progress; 

      g2d.setColor(getForeground()); 
      Arc2D arc = null; 
      if (isFillProgress()) { 
       arc = new Arc2D.Double(x, y, raidus, raidus, 90, -extent, Arc2D.PIE); 
      } else { 
       extent = 360 - extent; 
       arc = new Arc2D.Double(x, y, raidus, raidus, 90, extent, Arc2D.PIE); 
      } 
      g2d.fill(arc); 
      g2d.dispose(); 
     } 
    } 
}