如何解决java - 如何通过文本字段值更新滑块位置java swing
我正在制作一个简单的颜色选择器,我正在尝试通过用户输入的文本字段值更新我的滑块位置。它似乎有效,但只有当程序启动并且我输入 0 值时,滑块才会移动到 0,并且每次尝试输入新值时都不起作用。这是我的代码
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.changelistener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyFrame extends JFrame implements changelistener,ActionListener {
int width;
int height;
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JSlider slider = new JSlider(0,255,100);
JTextField textField = new JTextField();
JLabel label = new JLabel();
public MyFrame(int width,int height) {
super("SliderTest");
this.width = width;
this.height = height;
this.setPreferredSize(new Dimension(width,height));
panel1.setPreferredSize(new Dimension(150,150));
panel2.setPreferredSize(new Dimension(150,300));
slider.setPaintTicks(true);
slider.setMinorTickSpacing(15);
slider.setPaintTrack(true);
slider.setMajorTickSpacing(50);
slider.setPaintLabels(true);
slider.setorientation(SwingConstants.VERTICAL);
label.setText("R: ");
textField.setText(String.valueOf(slider.getValue()));
slider.setValue(Integer.parseInt(textField.getText()));
textField.addActionListener(this);
slider.addchangelistener(this);
panel1.setBounds(25,25,75,150);
panel2.setBounds(50,50,225,75);
panel1.setBackground(Color.GREEN);
panel2.add(slider);
panel2.add(textField);
this.add(panel1);
this.add(panel2);
}
@Override
public void stateChanged(ChangeEvent e) {
textField.setText("R: " + slider.getValue());
}
@Override
public void actionPerformed(ActionEvent e) {
slider.setValue(Integer.parseInt(textField.getText()));
}
}
解决方法
这是一个完整的 RGB 显示 GUI,它使用 JSliders
和 JTextFields
。
“技巧”是使用单独的 ActionListeners
和 ChangeListeners
。我用三个 ChangeListeners
表示 JSliders
,三个 ActionListeners
表示 JTextFields
/ JButtons
。
这是完整的可运行代码。我把所有的类都放在了内部类中,这样我就可以将代码作为一个块发布。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class RGBDisplay implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new RGBDisplay());
}
private final ColorModel colorModel;
private final DrawingPanel drawingPanel;
private JSlider redSlider;
private JSlider greenSlider;
private JSlider blueSlider;
private JTextField redField;
private JTextField greenField;
private JTextField blueField;
public RGBDisplay() {
this.colorModel = new ColorModel();
this.colorModel.setColor(128,128,128);
this.drawingPanel = new DrawingPanel(colorModel);
}
@Override
public void run() {
JFrame frame = new JFrame("RGB Display");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(drawingPanel,BorderLayout.CENTER);
frame.add(createSliderPanel(),BorderLayout.AFTER_LAST_LINE);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
System.out.println(frame.getSize());
}
private JPanel createSliderPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5,5);
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.0;
JLabel label = new JLabel("Red");
panel.add(label,gbc);
gbc.gridx++;
gbc.weightx = 1.0;
redSlider = new JSlider(0,255,colorModel.getRed());
redSlider.addChangeListener(new RedSliderListener(this,colorModel));
redSlider.setMajorTickSpacing(48);
redSlider.setMinorTickSpacing(8);
redSlider.setPaintLabels(true);
redSlider.setPaintTicks(true);
panel.add(redSlider,gbc);
gbc.gridx++;
gbc.weightx = 0.0;
redField = new JTextField(4);
panel.add(redField,gbc);
gbc.gridx++;
gbc.weightx = 0.0;
JButton button = new JButton("Change Red");
button.addActionListener(new RedFieldListener(this,colorModel));
panel.add(button,gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.weightx = 0.0;
label = new JLabel("Green");
panel.add(label,gbc);
gbc.gridx++;
gbc.weightx = 1.0;
greenSlider = new JSlider(0,colorModel.getGreen());
greenSlider.addChangeListener(new GreenSliderListener(this,colorModel));
greenSlider.setMajorTickSpacing(48);
greenSlider.setMinorTickSpacing(8);
greenSlider.setPaintLabels(true);
greenSlider.setPaintTicks(true);
panel.add(greenSlider,gbc);
gbc.gridx++;
gbc.weightx = 0.0;
greenField = new JTextField(4);
panel.add(greenField,gbc);
gbc.gridx++;
gbc.weightx = 0.0;
button = new JButton("Change Green");
button.addActionListener(new GreenFieldListener(this,gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.weightx = 0.0;
label = new JLabel("Blue");
panel.add(label,gbc);
gbc.gridx++;
gbc.weightx = 1.0;
blueSlider = new JSlider(0,colorModel.getBlue());
blueSlider.addChangeListener(new BlueSliderListener(this,colorModel));
blueSlider.setMajorTickSpacing(48);
blueSlider.setMinorTickSpacing(8);
blueSlider.setPaintLabels(true);
blueSlider.setPaintTicks(true);
panel.add(blueSlider,gbc);
gbc.gridx++;
gbc.weightx = 0.0;
blueField = new JTextField(4);
panel.add(blueField,gbc);
gbc.gridx++;
gbc.weightx = 0.0;
button = new JButton("Change Blue");
button.addActionListener(new BlueFieldListener(this,gbc);
updateSliderPanel();
return panel;
}
public void repaint() {
drawingPanel.repaint();
}
public void updateSliderPanel() {
redField.setText(Integer.toString(colorModel.getRed()));
greenField.setText(Integer.toString(colorModel.getGreen()));
blueField.setText(Integer.toString(colorModel.getBlue()));
}
public JSlider getRedSlider() {
return redSlider;
}
public JSlider getGreenSlider() {
return greenSlider;
}
public JSlider getBlueSlider() {
return blueSlider;
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final ColorModel colorModel;
public DrawingPanel(ColorModel colorModel) {
this.colorModel = colorModel;
this.setPreferredSize(new Dimension(300,200));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(colorModel.getColor());
g.fillRect(0,getWidth(),getHeight());
}
}
public class RedFieldListener implements ActionListener {
private final RGBDisplay frame;
private final ColorModel model;
public RedFieldListener(RGBDisplay frame,ColorModel model) {
this.frame = frame;
this.model = model;
}
@Override
public void actionPerformed(ActionEvent event) {
try {
int red = Integer.valueOf(redField.getText());
if (red >= 0 && red <= 255) {
int green = model.getGreen();
int blue = model.getBlue();
model.setColor(red,green,blue);
frame.getRedSlider().setValue(red);
frame.repaint();
}
} catch (NumberFormatException e) {
return;
}
}
}
public class GreenFieldListener implements ActionListener {
private final RGBDisplay frame;
private final ColorModel model;
public GreenFieldListener(RGBDisplay frame,ColorModel model) {
this.frame = frame;
this.model = model;
}
@Override
public void actionPerformed(ActionEvent event) {
try {
int green = Integer.valueOf(greenField.getText());
if (green >= 0 && green <= 255) {
int red = model.getRed();
int blue = model.getBlue();
model.setColor(red,blue);
frame.getGreenSlider().setValue(green);
frame.repaint();
}
} catch (NumberFormatException e) {
return;
}
}
}
public class BlueFieldListener implements ActionListener {
private final RGBDisplay frame;
private final ColorModel model;
public BlueFieldListener(RGBDisplay frame,ColorModel model) {
this.frame = frame;
this.model = model;
}
@Override
public void actionPerformed(ActionEvent event) {
try {
int blue = Integer.valueOf(blueField.getText());
if (blue >= 0 && blue <= 255) {
int green = model.getGreen();
int red = model.getRed();
model.setColor(red,blue);
frame.getBlueSlider().setValue(blue);
frame.repaint();
}
} catch (NumberFormatException e) {
return;
}
}
}
public class RedSliderListener implements ChangeListener {
private final RGBDisplay frame;
private final ColorModel model;
public RedSliderListener(RGBDisplay frame,ColorModel model) {
this.frame = frame;
this.model = model;
}
@Override
public void stateChanged(ChangeEvent event) {
JSlider source = (JSlider) event.getSource();
// if (!source.getValueIsAdjusting()) {
int red = source.getValue();
int green = model.getGreen();
int blue = model.getBlue();
model.setColor(red,blue);
frame.updateSliderPanel();
frame.repaint();
// }
}
}
public class GreenSliderListener implements ChangeListener {
private final RGBDisplay frame;
private final ColorModel model;
public GreenSliderListener(RGBDisplay frame,ColorModel model) {
this.frame = frame;
this.model = model;
}
@Override
public void stateChanged(ChangeEvent event) {
JSlider source = (JSlider) event.getSource();
// if (!source.getValueIsAdjusting()) {
int red = model.getRed();
int green = source.getValue();
int blue = model.getBlue();
model.setColor(red,blue);
frame.updateSliderPanel();
frame.repaint();
// }
}
}
public class BlueSliderListener implements ChangeListener {
private final RGBDisplay frame;
private final ColorModel model;
public BlueSliderListener(RGBDisplay frame,ColorModel model) {
this.frame = frame;
this.model = model;
}
@Override
public void stateChanged(ChangeEvent event) {
JSlider source = (JSlider) event.getSource();
// if (!source.getValueIsAdjusting()) {
int red = model.getRed();
int green = model.getGreen();
int blue = source.getValue();
model.setColor(red,blue);
frame.updateSliderPanel();
frame.repaint();
// }
}
}
public class ColorModel {
private int red;
private int green;
private int blue;
public void setColor(int red,int green,int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
public Color getColor() {
return new Color(red,blue);
}
public int getRed() {
return red;
}
public int getGreen() {
return green;
}
public int getBlue() {
return blue;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。