2014-10-22 3 views
0

Мне было интересно, как я могу заполнить дугу внутри эллипса градусами, так как пользователь настраивает значения ползунка. Я застрял, когда слушатель слайдера находится в другом файле из дуги и эллипса.Заполнение эллипса дугой с помощью слайдера-обработчика

+0

Вы должны начать с вызова 'super.paintComponent' перед выполнением какой-либо пользовательской раскраски, тогда вы должны записать текущее значение ползунка, вычислить диапазон и вызвать' repaint' – MadProgrammer

+0

@madProgrammer Спасибо! Итак, теперь, если у меня есть дуга, сделанная в другом файле, а слушатель - в другом, - есть ли способ, которым я могу это сделать, или слушатель для ползунка должен быть в том же файле, что и графика? Извините, если неясно .. – Mike

+0

Вам понадобится какая-то модель, чтобы связать два метода gether. Слушатель изменил бы модель, и модель сообщила бы рендеру – MadProgrammer

ответ

1
  1. Start, вызвав super.paintComponent, прежде чем делать какие-либо пользовательские картины, это позволит предотвратить любые возможные артефакты краски из сгенерирован, который, в то время как фанки, не очень приятно. См Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации
  2. Когда изменяется состояние ползунка, передать текущее значение компонента используется для рисования дуги и вызвать reapint на нем
  3. тщательно смешивая компоненты с пользовательской картины с другими компонентами (ползунок на панели дуги), так как это очень трудно определить, как выполнить пользовательскую картину, если вы не хотите, охватывается другими компонентами ...

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

    } 

}