java - JButton Action 监听器问题。字段中显示的 slider 值

标签 java swing jbutton jtextfield jslider

所以我有一个明天要交的程序,我一直在努力找出我的代码有什么问题。让我沉默了一段时间的第一个也是最大的问题是我的重置按钮 Action 监听器。它只是不会正确编译并说找不到值?我将其注释掉,这样我至少可以运行该程序,您应该能够清楚地看到我注释掉它们的位置。第二个问题是我必须让一个文本字段在移动它们时显示两个 slider 之间的最大值,另一个给我两个 slider 之间的总值。老实说,我不知道该怎么做才符合逻辑,只是简单地将两个 jtextfields 附加到左侧 slider 。为此,我希望能朝着正确的方向插入?如果你给我代码,我将不胜感激,但我也想解释为什么它有效/我的代码有什么问题。谢谢!

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;


/**
   This class displays a window with a slider component.
   The user can slide the left or right slider. As the 
    sliders are adjusted it displays the maximum sound 
    level coming from either slider as well as the total.
*/

public class SoundLevels extends JFrame
{
   private JLabel label1, label2, label3, label4;     // Message labels
   private JTextField maxSound;     // Max Sound Level
   private JTextField totalSound;   // Total Sound Level
   private JPanel mpanel;           // Max sound level panel
   private JPanel tpanel;           // Total sound level panel
   private JPanel sliderPanel1;     // Slider panel 1
    private JPanel sliderPanel2;     // Slider panel 2
    private JPanel resetpanel;       // Reset button panel
   private JSlider slider1;         // Left sound adjuster
    private JSlider slider2;         // Right sound adjuster
    private JButton resetButton;     // Reset button
   /**
      Constructor
   */

   public SoundLevels()
   {
      // Set the title.
      setTitle("Sound Levels");

      // Specify an action for the close button.
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Creates reset button
        resetButton = new JButton("Reset");

      // Create the message labels.
      label1 = new JLabel("Left:  ");
      label2 = new JLabel("Right: ");
        label3 = new JLabel("Max:   ");
        label4 = new JLabel("Total: ");

      // Create the read-only text fields.
      maxSound = new JTextField("0", 10);
      maxSound.setEditable(false);
      totalSound = new JTextField("0", 10);
      totalSound.setEditable(false);

      // Create the slider.
      slider1 = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
        slider2 = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
      slider1.addChangeListener(new SliderListener());

      // Create panels and place the components in them.
      mpanel = new JPanel();
        resetpanel = new JPanel();
        tpanel = new JPanel();
        sliderPanel1 = new JPanel();
        sliderPanel2 = new JPanel();

        //Add components to panels
        mpanel.add(label1);
      mpanel.add(maxSound);

        tpanel.add(label2);
      tpanel.add(totalSound);

        sliderPanel1.add(label1);
      sliderPanel1.add(slider1);

        sliderPanel2.add(label2);
        sliderPanel2.add(slider2);

        resetpanel.add(resetButton);           

      // Initialize event listener
//      resetButton.addActionListener(new ResetButtonListener());


        // Sets window to a border layout format.
      setLayout(new GridLayout(1, 5));


      // Add the panels to the content pane.
      add(sliderPanel1);
        add(sliderPanel2);
        add(resetpanel);
        add(mpanel);
      add(tpanel);


      // Pack and display the frame.
      pack();
      setVisible(true);
   }

   /**
      Private inner class that handles the event when
      the user clicks the Reset button.
   */

/* COMMENTED THIS OUT SO IT AT LEAST RUNS   
      private class ResetButtonListener implements ActionListener
      {
         public void actionPerformed(ActionEvent e)
         {
         // Set the panel's background to red.
            max = 0;  //should reset sliders to 0
                total = 0; //should reset sliders to 0
         }
      }
*/   

   /**
      Private inner class to handle the change events
      that are generated when the slider is moved.
   */

   private class SliderListener implements ChangeListener
   {
      public void stateChanged(ChangeEvent e)
      {
         int max, total;             

         // Get the slider value.
         max = slider1.getValue();
            total = slider1.getValue();

         // Store the total sound level in its display field.
         totalSound.setText(Integer.toString(total));

         // Store the max sound level in its display field.
         maxSound.setText(Integer.toString(max));
      }
   }

   /*
      The main method creates an instance of the
      class, which displays a window with a slider.
   */

   public static void main(String[] args)
   {
      new SoundLevels();
   }
}

最佳答案

我改变的是为两个 slider 添加一个监听器-

slider1.addChangeListener(new SliderListener());
slider2.addChangeListener(new SliderListener());

并且还对 slider 监听器进行了更改 -

private class SliderListener implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
            int max = 0;
            int total = 0;
            // Get the slider value.
            int slider1Val = slider1.getValue();
            int slider2Val = slider2.getValue();
            if (slider1Val > slider2Val) {
                max = slider1Val;
            } else {
                max = slider2Val;
            }
            total = slider2Val + slider1Val;
            // Store the total sound level in its display field.
            totalSound.setText(Integer.toString(total));

            // Store the max sound level in its display field.
            maxSound.setText(Integer.toString(max));
        }
    }

下面是整个编辑代码的方式——

package org.dchan.orm;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * This class displays a window with a slider component. The user can slide the
 * left or right slider. As the sliders are adjusted it displays the maximum
 * sound level coming from either slider as well as the total.
 */

public class SoundLevels extends JFrame {
    private JLabel label1, label2, label3, label4; // Message labels
    private JTextField maxSound; // Max Sound Level
    private JTextField totalSound; // Total Sound Level
    private JPanel mpanel; // Max sound level panel
    private JPanel tpanel; // Total sound level panel
    private JPanel sliderPanel1; // Slider panel 1
    private JPanel sliderPanel2; // Slider panel 2
    private JPanel resetpanel; // Reset button panel
    private JSlider slider1; // Left sound adjuster
    private JSlider slider2; // Right sound adjuster
    private JButton resetButton; // Reset button

    /**
     * Constructor
     */

    public SoundLevels() {
        // Set the title.
        setTitle("Sound Levels");

        // Specify an action for the close button.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Creates reset button
        resetButton = new JButton("Reset");

        // Create the message labels.
        label1 = new JLabel("Left:  ");
        label2 = new JLabel("Right: ");
        label3 = new JLabel("Max:   ");
        label4 = new JLabel("Total: ");

        // Create the read-only text fields.
        maxSound = new JTextField("0", 10);
        maxSound.setEditable(false);
        totalSound = new JTextField("0", 10);
        totalSound.setEditable(false);

        // Create the slider.
        slider1 = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
        slider2 = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
        slider1.addChangeListener(new SliderListener());
        slider2.addChangeListener(new SliderListener());
        // Create panels and place the components in them.
        mpanel = new JPanel();
        resetpanel = new JPanel();
        tpanel = new JPanel();
        sliderPanel1 = new JPanel();
        sliderPanel2 = new JPanel();

        // Add components to panels
        mpanel.add(label1);
        mpanel.add(maxSound);

        tpanel.add(label2);
        tpanel.add(totalSound);

        sliderPanel1.add(label1);
        sliderPanel1.add(slider1);

        sliderPanel2.add(label2);
        sliderPanel2.add(slider2);

        resetpanel.add(resetButton);

        // Initialize event listener
        // resetButton.addActionListener(new ResetButtonListener());

        // Sets window to a border layout format.
        setLayout(new GridLayout(1, 5));

        // Add the panels to the content pane.
        add(sliderPanel1);
        add(sliderPanel2);
        add(resetpanel);
        add(mpanel);
        add(tpanel);

        // Pack and display the frame.
        pack();
        setVisible(true);
    }

    /**
     * Private inner class that handles the event when the user clicks the Reset
     * button.
     */

    /*
     * COMMENTED THIS OUT SO IT AT LEAST RUNS
     */private class ResetButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // Set the panel's background to red.
            // max = 0; // should reset sliders to 0
            // total = 0; // should reset sliders to 0
            slider1.setValue(0);
            slider2.setValue(0);
        }
    }

    /*
*/

    /**
     * Private inner class to handle the change events that are generated when
     * the slider is moved.
     */

    private class SliderListener implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
            int max = 0;
            int total = 0;
            // Get the slider value.
            int slider1Val = slider1.getValue();
            int slider2Val = slider2.getValue();
            if (slider1Val > slider2Val) {
                max = slider1Val;
            } else {
                max = slider2Val;
            }
            total = slider2Val + slider1Val;
            // Store the total sound level in its display field.
            totalSound.setText(Integer.toString(total));

            // Store the max sound level in its display field.
            maxSound.setText(Integer.toString(max));
        }
    }

    /*
     * The main method creates an instance of the class, which displays a window
     * with a slider.
     */

    public static void main(String[] args) {
        new SoundLevels();
    }
}

监听器的创建需要一点逻辑理解。但是您需要了解,要从两个 slider 中获取一个事件,应该将监听器应用于两者。整个代码的要点可在 - https://gist.github.com/4193279 获得。 .

为了将来引用,我建议您将问题分成几个部分。

关于java - JButton Action 监听器问题。字段中显示的 slider 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678351/

相关文章:

java - Eclipse 是否有开箱即用的 GUI 构建器?

java - 清除 JTextArea 中的文本

java - Android proguard,保持内部类

java - double 到 int 类型转换是否会被视为隐式类型转换?

Java - MigLayout 设置边界

java - JButton 的 ActionListener

java - 如何防止我的 JFrame 卡住?

java - Jbutton 没有清除我的文本字段

java - jScrollPane 无法添加组件

java - 未调用自定义身份验证提供程序