【发布时间】:2014-11-24 05:35:41
【问题描述】:
我有一个家庭作业,我必须更改颜色选择器(它有 3 个滑块,RGB 并显示颜色),以便有文本字段,并且当在字段中输入值时,它也会更改滑块.我得到了基本的想法,但是我无法找到更改文本字段的解决方案,它们仅适用于动作事件。这是我的代码
package colorchooser;
import java.util.Vector;
import java.awt.Color;
import javax.swing.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
/**
*
* @author -
*/
public class ColorChooser extends javax.swing.JPanel implements ChangeListener, ActionListener{
private Vector listeners;
/**
* Creates new form ColorChooser
*/
public ColorChooser() {
initComponents();
listeners = new Vector();
sldRed.addChangeListener(this);
sldGreen.addChangeListener(this);
sldBlue.addChangeListener(this);
txtRed.addActionListener(this);
// Variables declaration - do not modify
private javax.swing.JButton btnSetColor;
private javax.swing.JLabel lblBlue;
private javax.swing.JLabel lblGreen;
private javax.swing.JLabel lblRed;
private javax.swing.JSlider sldBlue;
private javax.swing.JSlider sldGreen;
private javax.swing.JSlider sldRed;
private javax.swing.JTextField txtBlue;
private javax.swing.JTextField txtGreen;
private javax.swing.JTextField txtRed;
// End of variables declaration
@Override
public void stateChanged(ChangeEvent ce) {
int r = sldRed.getValue();
int g = sldGreen.getValue();
int b = sldBlue.getValue();
Color color = new Color(r,g,b);
fireColorEvent(new ColorEvent(this,color));
txtRed.setText(Integer.toString(r));
txtGreen.setText(Integer.toString(g));
txtBlue.setText(Integer.toString(b));
}
public void addColorListener(ColorListener colorListener){
listeners.addElement(colorListener);
}
public void actionPerformed(ActionEvent ae) {
if(ae.getSource()==btnSetColor){
try
{
if(Integer.parseInt(txtRed.getText()) <= 255){
sldRed.setValue(Integer.parseInt(txtRed.getText()));
}
else
{
txtRed.setText("0");
JOptionPane.showMessageDialog(this,"Error: Please enter a value equal to or less than 255");
}
if(Integer.parseInt(txtBlue.getText()) <= 255){
sldBlue.setValue(Integer.parseInt(txtBlue.getText()));
}
else
{
txtBlue.setText("0");
JOptionPane.showMessageDialog(this,"Error: Please enter a value equal to or less than 255");
}
if(Integer.parseInt(txtGreen.getText()) <= 255){
sldGreen.setValue(Integer.parseInt(txtGreen.getText()));
}
else
{
txtGreen.setText("0");
JOptionPane.showMessageDialog(this,"Error: Please enter a value equal to or less than 255");
}
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(this,"Error: Please Enter Numbers");
txtRed.setText("0");
txtGreen.setText("0");
txtBlue.setText("0");
sldRed.setValue(Integer.parseInt(txtRed.getText()));
sldGreen.setValue(Integer.parseInt(txtGreen.getText()));
sldBlue.setValue(Integer.parseInt(txtBlue.getText()));
}
}
}
您可以看到我正在向滑块添加更改侦听器,但我必须向 txtRed 添加一个动作侦听器,因为它不接受 addChangeListener。关于变通的任何想法?
谢谢!
【问题讨论】:
-
这种方法有什么问题?这就是它的工作原理。不过要提醒一句,当您更新
JSlider的状态时,它会触发ChangeEvent,这将导致文本字段发生更改;) -
@MadProgrammer 有了动作事件,当我按下回车或点击按钮时它会更新,但我希望它在我输入键时更新
标签: java swing actionlistener