2014-10-22 70 views
0

我想知道如何在用户调整滑块值时用度数填充椭圆内的圆弧。我陷入与弧和椭圆不同的文件中的滑块侦听器。做任何自定义涂装前调用super.paintComponent使用滑块处理程序用圆弧填充椭圆

+0

你会在做任何自定义绘画之前先调用'super.paintComponent',然后记录当前滑动值,计算范围并调用'repaint' – MadProgrammer 2014-10-22 00:57:03

+0

@madProgrammer谢谢!所以,现在如果我在不同的文件中创建了弧线,并且与之不同的侦听器,有什么办法可以做到这一点,或者滑块的侦听器是否需要与图形在同一个文件中?对不起,如果不清楚.. – Mike 2014-10-22 01:09:56

+0

你需要某种模型来链接两个一起。监听器会修改模型,模型会通知渲染器 – MadProgrammer 2014-10-22 01:11:23

回答

1
  1. 开始,这将阻止已生成,它们虽然时髦,不是非常好的任何可能的油漆瑕疵。详情参见
  2. Painting in AWT and SwingPerforming Custom Painting当滑块的状态发生改变,当前值传递给该组件被用来绘制弧形并在其上调用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(); 
     } 

    } 

}