2017-12-04 15 views
0

원이 슬라이더에 의해 크기가 조정될 때 원을 무작위로 변경하려고합니다. 몇 가지 방법을 시도했지만 stateChanged 메서드에서 setColor 메서드를 호출해야하지만 어떻게해야할지 모릅니다. 여기크기가 변경 될 때 원의 색 변경

내 두 클래스입니다

import java.awt.Graphics; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JPanel; 
import java.util.Random; 

    public class OvalPanel extends JPanel 
    { 
     private int diameter = 10; // default diameter 
     private Color myGreen = new Color(0, 255, 0); 
     private Random rand = new Random(); 
     private int r = rand.nextInt(256); 
     private int g = rand.nextInt(256); 
     private int b = rand.nextInt(256); 
     private Color circleColor = new Color(r, g, b); 

    // draw an oval of the specified diameter 
    @Override 
    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    g.setColor(myGreen); 
    g.fillOval(10, 10, diameter, diameter); 
    } 

    // validate and set diameter, then repaint 
    public void setDiameter(int newDiameter) 
    { 
    // if diameter invalid, default to 10 
    diameter = (newDiameter >= 0 ? newDiameter : 10); 
    repaint(); // repaint panel 
    } 

    public void setColor(int newR, int newG, int newB) 
    { 
     r = newR; 
     g = newG; 
     b = newB; 
    } 

    // used by layout manager to determine preferred size 
    public Dimension getPreferredSize() 
    { 
    return new Dimension(200, 200); 
    } 

    // used by layout manager to determine minimum size 
    public Dimension getMinimumSize()     
    {             
     return getPreferredSize();       
    }    

    public double getDiameter() 
    { 
     return diameter; 
    } 
} // end class OvalPanel 

2 클래스 I는 setColor를()을 따라서, stateChanged()

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.text.DecimalFormat; 

import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.JTextArea; 
import javax.swing.SwingConstants; 
import javax.swing.event.ChangeListener; 
import javax.swing.event.ChangeEvent; 

public class SliderFrame extends JFrame 
{ 
    private final JSlider diameterJSlider; // slider to select diameter 
    private final OvalPanel myPanel; // panel to draw circle 
    private JTextArea stats; 
    private double radius; 
    private double diameter; 
    private double circumference; 
    private double area; 

    // no-argument constructor 
    public SliderFrame() 
    { 
    super("Circle Statistics"); 

    myPanel = new OvalPanel(); // create panel to draw circle 
    myPanel.setBackground(Color.LIGHT_GRAY); 
    stats = new JTextArea(1, 100); 

    // set up JSlider to control diameter value      
    diameterJSlider =             
     new JSlider(SwingConstants.HORIZONTAL, 0, 400, 10);    
    diameterJSlider.setMajorTickSpacing(10); // create tick every 10 
    diameterJSlider.setPaintTicks(true); // paint ticks on slider  

    // register JSlider event listener         
    diameterJSlider.addChangeListener(        
     new ChangeListener() // anonymous inner class     
     {                
      // handle change in slider value        
      @Override             
      public void stateChanged(ChangeEvent e)      
      {               
       myPanel.setDiameter(diameterJSlider.getValue()); 
       radius = diameterJSlider.getValue() * .5; 
       diameter = diameterJSlider.getValue(); 
       circumference = Math.PI * diameterJSlider.getValue(); 
       area = Math.PI * radius * radius; 
       stats.setText(String.format("Radius: %.5f Diameter %.5f Circumference %.5f Area %.5f", radius, diameter, circumference, area)); 
       // help here? 
       repaint(); 
      }               
     }                
    );                 

    add(diameterJSlider, BorderLayout.SOUTH); 
    add(myPanel, BorderLayout.CENTER); 
    add(stats, BorderLayout.NORTH); 
    } 
} // end class SliderFrame 

편집에서 호출 할 필요가 기분이 : 클래스는에 달렸다되고있다 테스터 클래스이지만 그 안에있는 모든 것은 프레임 정보입니다.

답변

0

그럼, 먼저는 setColor를 해결하기 위해 필요 - 당신이 myGreen를 업데이트 (및 repaint를 호출) 할 필요가 myGreen 당신의 paint 방법을 사용하기 때문에. 마찬가지로,

public void setColor(int newR, int newG, int newB) { 
    r = newR; 
    g = newG; 
    b = newB; 
    myGreen = new Color(r, g, b); 
    repaint(); 
} 

그런 다음 SliderFrame.stateChanged에서, (예를 들어) 빨간색으로 Oval를 설정한다.

myPanel.setColor(255, 0, 0); 

임의의 색상을 원하면 임의의 값으로 setColor을 호출하십시오.

+0

도움 주셔서 대단히 감사합니다. 나는 당신이 말한 것과 지금 색상이 바뀌면서 코드를 업데이트했습니다. 그러나 첫 번째 크기 변경시에만 변경됩니다. 모든 크기를 변경하거나 처음에만 크기를 바꿀 수있는 방법이 있습니까? – DHeck

+0

@DHeck 매번 myPanel.setColor를 호출 할 때 다른 색상을 선택하면됩니다.'Random # nextInt (256)'을 살펴보십시오. –