【问题标题】:Having Trouble Using JButton to Increment/Decrement value of JTextField无法使用 JButton 增加/减少 JTextField 的值
【发布时间】:2019-09-03 08:53:07
【问题描述】:

我无法使用 JButtons 增加/减少已设置的 JTextField。

我知道动作监听器是必要的,但我不知道如何设置它。我还必须为多个 JButton 设置此设置,这使此过程更加复杂。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class App1 extends JFrame implements ActionListener, MouseListener
{
    JPanel upper, lower, jp1, jp2, jp3;
    JButton jb1, jb2, jb3, jb4, jb5, jb6;
    JLabel jl1, jl2, jl3;
    JTextField jtf1, jtf2, jtf3;
    int count = 128;

    public static void main(String[] args) {
        App1 a1 = new App1();
    }

    public App1() {

        JFrame myFrame = new JFrame("Color Selector");
        myFrame.setLocationRelativeTo(null);
        myFrame.setSize(new Dimension(600,400));

        GridLayout layout = new GridLayout(2,1);
        myFrame.setLayout(layout);

        JPanel upper = new JPanel();
        upper.setBackground(Color.GRAY);

        JPanel lower = new JPanel(); add(lower);
        lower.setLayout(new BoxLayout(lower, BoxLayout.X_AXIS));
        lower.setBackground(Color.GRAY);
        JPanel jp1 = new JPanel(); lower.add(jp1);
        JPanel jp2 = new JPanel(); lower.add(jp2);
        JPanel jp3 = new JPanel(); lower.add(jp3);
        lower.addMouseListener(this);

        JLabel jl1 = new JLabel("Red"); jp1.add(jl1);
        JLabel jl2 = new JLabel("Green"); jp2.add(jl2);
        JLabel jl3 = new JLabel("Blue"); jp3.add(jl3);

        jp1.setBackground(Color.RED);
        jp2.setBackground(Color.GREEN);
        jp3.setBackground(Color.BLUE);

        JButton jb1 = new JButton("R-"); jp1.add(jb1);
        JTextField jtf1 = new JTextField(6);jp1.add(jtf1);
        jtf1.setText("128");
        JButton jb2 = new JButton("R+"); jp1.add(jb2);
        jb1.addActionListener(this);
        jb2.addActionListener(this);

        JButton jb3 = new JButton("G-"); jp2.add(jb3);
        JTextField jtf2 = new JTextField(6);jp2.add(jtf2);
        jtf2.setText("128");
        JButton jb4 = new JButton("G+"); jp2.add(jb4);
        jb3.addActionListener(this);
        jb4.addActionListener(this);

        JButton jb5 = new JButton("B-"); jp3.add(jb5);
        JTextField jtf3 = new JTextField(6);jp3.add(jtf3);
        jtf3.setText("128");
        JButton jb6 = new JButton("B+"); jp3.add(jb6);
        jb5.addActionListener(this);
        jb6.addActionListener(this);

        myFrame.add(upper);
        myFrame.add(lower);

        myFrame.setVisible(true);
    }

    private void start() {
        // TODO Auto-generated method stub
    }

    private static String setEditable(String string) {
        // TODO Auto-generated method stub
        return null;
    }

    private static String setText(String string) {
        // TODO Auto-generated method stub
        return null;
    }

    private static void add(JPanel lower) {
        // TODO Auto-generated method stub
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
    }

    private void rebuild() {
        // TODO Auto-generated method stub
    }
}   

我希望 JButton 使用 JButton 将已设置的 JTextField“128”增加/减少 +1 或 -1。

【问题讨论】:

  • 为什么不直接使用JSpinner?它已经提供了向上/向下按钮来增加值。阅读 How to Use Spinners 上的 Swing 教程部分,了解更多信息和工作示例。

标签: java swing jbutton actionlistener jtextfield


【解决方案1】:

在这种情况下,为每个按钮设置一个单独的动作监听器会更简单。例如:
而不是

jb1.addActionListener(this);
jb2.addActionListener(this);

    jb1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            jtf1.setText(String.valueOf(Integer.valueOf(jtf1.getText())-1));
        }
    });

    jb2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            jtf1.setText(String.valueOf(Integer.valueOf(jtf1.getText())+1));
        }
    });

(所以App1不需要实现ActionListener

注意:使用 lambda 表达式使上面的代码看起来像:

jb1.addActionListener(e -> jtf1.setText(String.valueOf(Integer.valueOf(jtf1.getText())-1)));
jb2.addActionListener(e -> jtf1.setText(String.valueOf(Integer.valueOf(jtf1.getText())+1)));

旁注:您声明了两次变量。
例如,您有一个字段JTextField jtf1 和后来的JTextField jtf1 = new JTextField(6);。该字段保持为空。

【讨论】:

【解决方案2】:

在您的 actionPerfomed() 方法中,您可以确定使用 e.getActionCommand() 单击了哪个按钮,然后在每种情况下执行您需要执行的操作

@Override
public void actionPerformed(ActionEvent e) {
    String sourceButton = e.getActionCommand(); 
    if (sourceButton.equals("B-")) {
       // code for B- button
    } 
    else if (sourceButton.equals("B+")) {
        // code for B+ button
    }
    // etc
    // etc
}

【讨论】:

  • 我仍然无法增加 JTextField 的实际值(“128”)。我知道某处有错误。我查阅了我的笔记和之前的例子,但我就是想不通
  • int result = Integer.parseInt(jtf3.getText()) + 1; jtf3.setText(String.valueOf(result));
  • 首先,感谢您的帮助。我还是想不通。这就是我所拥有的:String sourceButton = e.getActionCommand(); if (sourceButton.equals("B-")) { int result = Integer.parseInt(jtf3.getText()) - 1; jtf3.setText(String.valueOf(result)); } else if (sourceButton.equals("B+")) { int result = Integer.parseInt(jtf3.getText()) + 1; jtf3.setText(String.valueOf(result));} }
  • 那么你的问题是什么?注意我在这里使用了 jtf3 文本字段变量,我不确定在这种情况下是否是您要更新的文本字段
  • 它不起作用。我相信 jtf3 将适用于这种情况。
猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2021-11-21
  • 2013-04-08
  • 1970-01-01
  • 2016-05-05
相关资源
最近更新 更多