2017-12-04 30 views
0

円をスライダでサイズ変更すると、円をランダムに変更しようとしています。私はいくつかの方法を試しましたが、私はstateChangedメソッドでsetColorメソッドを呼び出す必要があることを知っていますが、方法はわかりません。ここでサイズ変更時にサークルの色を変更する

は私の2クラスである:)私は(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 

第二クラスの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を修正する必要があります - あなたのpaint方法は、あなたがmyGreenを更新(およびrepaintを呼び出す)する必要がmyGreen使用しているので。以下のような、

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

ランダムな色を使用する場合は、ランダム値3つのsetColorを呼び出します。

+0

ありがとうございました。私は、あなたが言ったことでコードを更新して、色が変更されました。ただし、最初のサイズ変更でのみ変更されます。すべてのサイズ変更または最初の変更のみで変更する方法はありますか? – DHeck

+0

@DHeck別の色を選択するだけです(毎回 'myPanel.setColor'を呼び出すときには' Random#nextInt(256) 'を見てください) –