import java.awt.*;
import java.awt.event.*;
public class TestColorPalette{
private Frame frame ;
private Panel p;
TextField tfr,tfg,tfb;
Scrollbar sbr,sbg,sbb;
private int r = 255, g = 255, b = 255;
private Dialog alertDialog;

public static void main(String[] args){
new TestColorPalette().init();
}
private void init(){
MyMonitor mm = new MyMonitor();
frame  = new Frame("调色板");
p = new Panel();
alertDialog = this.createAlertDialog();
p.setBackground(Color.white);
tfr = new TextField("255");
tfg = new TextField("255");
tfb = new TextField("255");
tfr.setName("tfr");
tfg.setName("tfg");
tfb.setName("tfb");
tfr.addTextListener(mm);
tfg.addTextListener(mm);
tfb.addTextListener(mm);
sbr = new Scrollbar(Scrollbar.HORIZONTAL,255,0,0,256);
sbg = new Scrollbar(Scrollbar.HORIZONTAL,255,0,0,256);
sbb = new Scrollbar(Scrollbar.HORIZONTAL,255,0,0,256);
sbr.setName("sbr");
sbg.setName("sbg");
sbb.setName("sbb");
sbr.setBackground(Color.red);
sbg.setBackground(Color.green);
sbb.setBackground(Color.blue);
sbr.addAdjustmentListener(mm);
sbg.addAdjustmentListener(mm);
sbb.addAdjustmentListener(mm);
Panel ptf = new Panel(new GridLayout(3,2));
ptf.add(new Label("红色"));
ptf.add(tfr);
ptf.add(new Label("绿色"));
ptf.add(tfg);
ptf.add(new Label("蓝色"));
ptf.add(tfb);
Panel psb = new Panel(new GridLayout(3,1));
psb.add(sbr);
psb.add(sbg);
psb.add(sbb);
Panel pcolor = new Panel(new BorderLayout());
pcolor.add(ptf,"West");
pcolor.add(psb,"Center");
frame.add(p,"Center");
frame.add(pcolor,"South");
frame.setBounds(400,400,400,300);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
frame.setVisible(false);
System.exit(0);
}
});


}
private Dialog createAlertDialog(){
Dialog d = new Dialog(frame,"错误",true);
Label note = new Label("输入出错");
Button submit = new Button("确定");
submit.addActionListener(this.new MyMonitor());
d.setLayout(new FlowLayout(FlowLayout.CENTER,50,20));
d.add(note);
d.add(submit);
d.setBounds(450,450,200,130);
d.setResizable(false);
d.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
alertDialog.setVisible(false);
}
});
return d;
}

//nested class MyMonitor
class MyMonitor implements TextListener,AdjustmentListener,ActionListener {

@Override
public void textValueChanged(TextEvent e){
TextField tf_temp = (TextField)e.getSource();
String tf_name = tf_temp.getName();
String num =  tf_temp.getText();
//this.numCheck(tf_temp,num);
int value = 0 ;
value = this.numCheck(tf_temp, num);
if("tfr".equals(tf_name)){
r =value;
sbr.setValue(r);
}else if("tfg".equals(tf_name)){
g = value;
sbg.setValue(g);
}else if("tfb".equals(tf_name)){
b = value;
sbb.setValue(b);
}
this.refresh();
} @Override
public void adjustmentValueChanged(AdjustmentEvent e)   {    
Scrollbar sb_temp = (Scrollbar)e.getSource();
String sb_name = sb_temp.getName();                         
int sb_value = sb_temp.getValue();
if("sbr".equals(sb_name)){      
r = sb_value;
tfr.setText(String.valueOf(r));
}else if("sbg".equals(sb_name)){
g = sb_value;
tfg.setText(String.valueOf(g));
}else if("sbb".equals(sb_name)){
b = sb_value;
tfb.setText(String.valueOf(b));
}
this.refresh();
}
@Override 
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
if("确定".equals(s)){
alertDialog.setVisible(false);
}
}
private void refresh() {
Color c = new Color(r,g,b);
p.setBackground(c);
}
private int numCheck(TextField tf_temp,String num) {
int i = 0;
while(num.matches("0+\\d+")){//去掉开头0
num = num.substring(1);
}
//num = num.replaceAll("^[0]+","");
try{
i = Integer.parseInt(num);
//tf_temp.setText(num);
if(i>255){  //这个最多只会发生一次不会发生死循环;
//tf_temp.setText(Integer.toString(255));
i = 255;
num = "255";
tf_temp.setText(num);
System.out.println(i);
}else {
tf_temp.setText(num);  //死循环。setText触发了TextvalueChanged()调用numCheck()发现小于255,这个else又成立,这样死循环;

System.out.println(i);
}
//tf_temp.setText(num);
//System.out.println(num);
 }catch(NumberFormatException e){
 alertDialog.setVisible(true);
 tf_temp.setText("255");
 e.printStackTrace();
 }
 return i;
}

}}

解决方案 »

  1.   

    我改了numCheck():
    private int numCheck(TextField tf_temp, String num){
    int i = 0;
    while(num.startsWith("00")){
    num = num.substring(1);
    tf_temp.setText(num);  //这句一定要加上,不然的话如果用户写的是00000while之后就只有一个0了,下面的if不成立,这样tf_temp显示不出来;
    tf_temp.setSelectionStart(3);
    System.out.println(num);
    }
    if(num.matches("0\\d+")){
    num = num.substring(1);
    ///tf_temp.setSelectionStart(1);
    tf_temp.setText(num);
    tf_temp.setSelectionStart(1);
    }
    try{
    i = Integer.parseInt(num);
    if(i>255){
    tf_temp.setText("255");
    tf_temp.setSelectionStart(3);
    return 255;
    }else {

    }
    }catch(NumberFormatException e){
    alertDialog.setVisible(true);
    //e.printStackTrace();
    tf_temp.setText("255");
    tf_temp.setSelectionStart(3);
    return 255;
    }
    return i;
    }各位还有没有好的办法。