2014-10-22 4 views
0

사용자가 슬라이더 값을 조정할 때도가있는 타원 내부의 호를 어떻게 채울 수 있는지 궁금합니다. 나는 원호와 타원과 다른 파일에있는 슬라이더 청취자에 붙어있다.슬라이더 핸들러를 사용하여 호가있는 타원을 채우기

+0

커스텀 페인팅을하기 전에'super.paintComponent'를 호출하면됩니다. 그러면 현재 슬라이더 값을 기록하고, 범위를 계산하고'repaint'를 호출 할 것입니다. – MadProgrammer

+0

@madProgrammer Thanks! 그래서 지금 내가 다른 파일에 만들어진 호와 다른 것과 같은 리스너를 가지고 있다면, 이것을 할 수있는 방법이 있습니까, 아니면 슬라이더에 대한 리스너가 그래픽과 같은 파일에 있어야합니까? 죄송합니다. 확실하지 않은 경우 ... – Mike

+0

두 게처를 연결하려면 어떤 종류의 모델이 필요합니다. 리스너가 모델을 수정하고 모델이 렌더러에 알릴 것입니다. – MadProgrammer

답변

1
  1. 사용자 정의 페인팅을 수행하기 전에 super.paintComponent을 호출하여 시작하면 가능한 벙어리가 아닌 멋진 페인트 아티팩트가 생성되지 않도록합니다. 슬라이더의 상태가 변경이, 다른 구성 요소와 사용자 페인팅
  2. 수 조심스럽게 혼합 구성 요소를 아크를 칠하고 그 위에 reapint를 호출하는 데 사용 된 구성 요소에 현재 값을 전달하는 경우 (자세한 내용은
  3. 에 대한 Painting in AWT and SwingPerforming Custom Painting를 참조하십시오 아크 창에서 슬라이더), 그것은 당신이 다른 구성 요소에 포함하지 않으려면 사용자 지정 그림을 수행하는 방법을 결정하는 것은 매우 어려운로 ...

Arc

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class FillEllipse { 

    public static void main(String[] args) { 
     new FillEllipse(); 
    } 

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

       final ArcPane arcPane = new ArcPane(); 
       final JSlider slider = new JSlider(0, 360); 
       slider.addChangeListener(new ChangeListener() { 
        @Override 
        public void stateChanged(ChangeEvent e) { 
         int value = slider.getValue(); 
         arcPane.setAngle(value); 
        } 
       }); 
       slider.setValue(0); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(arcPane); 
       frame.add(slider, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ArcPane extends JPanel { 

     private int angel; 

     public ArcPane() { 
     } 

     public void setAngle(int angel) { 

      this.angel = angel; 
      repaint(); 

     } 

     public int getAngel() { 
      return angel; 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      int diameter = Math.min(getWidth(), getHeight()); 
      int x = (getWidth() - diameter)/2; 
      int y = (getHeight() - diameter)/2; 

      g2d.setColor(Color.RED); 
      g2d.fillArc(x, y, diameter, diameter, 0, getAngel()); 
      g2d.dispose(); 
     } 

    } 

}