微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java - 如何通过文本字段值更新滑块位置java swing

如何解决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,它使用 JSlidersJTextFields

RGB Display

“技巧”是使用单独的 ActionListenersChangeListeners。我用三个 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 举报,一经查实,本站将立刻删除。