要求设计如下面板拖动滑块可以设置面板的颜色。
我的代码如下
但是我怎么拖动滑块上面的颜色都不改变。
请问我这个程序错在哪里了?该如何改正?
谢谢!package first;import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;public class ColorTest {
     public static void main(String[] args)
     {
      EventQueue.invokeLater(new Runnable()
      {
      public void run()
      {
      ColourFrame frame = new ColourFrame();
      frame.setTitle("ColorTest");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
      }
      }
      );
     }
}class ColourFrame extends DrawFrame
{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private JPanel displayPanel ;
private JPanel sliderPanel;
private Color color ;
private int val1 ,val2 ,val3 ;

public ColourFrame()
{
setLayout(new BorderLayout());
displayPanel = new JPanel();
add(displayPanel,"Center");

sliderPanel = new JPanel();
sliderPanel.setLayout(new GridLayout(3,2));
JSlider greenSlider = new JSlider(0,255,0);
JSlider blueSlider = new JSlider(0,255,0);
JSlider redSlider = new JSlider(0,255,0);
sliderPanel.add(new JLabel("Red"));    sliderPanel.add(redSlider);
sliderPanel.add(new JLabel("Blue"));   sliderPanel.add(blueSlider);
sliderPanel.add(new JLabel("Green"));  sliderPanel.add(greenSlider);


redSlider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent event)
{
JSlider source = (JSlider) event.getSource();
val1 = source.getValue();
}
});

blueSlider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent event)
{
JSlider source = (JSlider) event.getSource();
val2 = source.getValue();
}
});

greenSlider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent event)
{
JSlider source = (JSlider) event.getSource();
val3 = source.getValue();
}
});

add(sliderPanel,"South");
color = new Color(val1 ,val2 ,val3);
displayPanel.setBackground(color);
}
}

解决方案 »

  1.   


    redSlider.addChangeListener(new ChangeListener()
    {
        public void stateChanged(ChangeEvent event)
        {
            JSlider source = (JSlider) event.getSource();
            val1 = source.getValue();
        }
    });你监听函数中,只是获取slider的值,没有设置面板的颜色.把下面的加进去,
    color = new Color(val1 ,val2 ,val3);
    displayPanel.setBackground(color);
      

  2.   

    JSlider和JPanel原来没有什么联系,是程序员将它们联系起来的。slider监听用户对它的拖动操作,获取slider的值,然后根据三个值去组合成一个color并设置panel的背景色。你原先的程序中,在监听程序中只是获取slider的值,可是你却不去设置panel的背景色,当然没变化了
      

  3.   

    你说按照我的方法改后可以了,却不知道为什么要这样做。
    如果是你自己写的,你应该知道,设置面板背影就是要
    color = new Color(val1 ,val2 ,val3);
    displayPanel.setBackground(color);
    而你的程序是想用slider获取用户选择的颜色,而获取了颜色当然要再进行设置啊,你不设置,面板如何会改变?
    所以,当然要把上面两行代码加入到监听函数中啊
      

  4.   


    先说我原来的那个程序吧,我是利用 val 来获取了 JSlider 的值,然后想通过 val 来设置颜色,在然后来改变现实面板的颜色。但是因为我的没有把设置颜色和改变面板颜色的那段代码即:color = new Color(val1 ,val2 ,val3);
    displayPanel.setBackground(color);添加到监听的函数,而只是在最后添加了这行代码,所以这行不通,改变不了面板的颜色。
    所以说我原来的程序就是错在没有把改变面板颜色的代码添加到监听函数中,对吧?之前是不知道所以才到这里来发帖求教的。
    难道说这样就有了这段程序不是我写的嫌疑?
      

  5.   

    你的构造函数只是在创建对象的时候执行一次,之后是不会再执行的。当你的slider被用户调整后会调用其监听函数,不可能再执行你的构造函数。所以你对背景色的设置必须在监听函数之内。
    我认为这个你不应该不知道的,所以就怀疑这不是你写的,嘿嘿