Как я могу сделать Jbutton в моем виджете для реализации правильного события - PullRequest
0 голосов
/ 22 апреля 2020

Инструкции:

Write a WidgetViewer GUI that has the following widgets:

a button labeled "go up/down"
a label initialized to 0 (we'll call this the left label)
a label initialized to 0 (we'll call this the right label)
a button labeled "go down/up"

When the "go up/down" button is pushed, a random number between 1 and 10 (inclusive)
is generated and added to the left label, and another random number between 1 and 10 (inclusive)
is generated and subtracted from the right label.

When the "go down/up" button is pushed, a random number between 1 and 10 (inclusive) is
generated and subtracted from the left label, and another random number between 1 and 10
(inclusive) is generated and added to the right label.

Сообщение об ошибке:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Go up/down"

Код:

Я не могу понять это сообщение об ошибке, возможно, есть вероятность, что Я добавляю строку, но я не уверен, это может быть мой лог c. Но я пытаюсь выяснить, как я могу заставить Jbutton под названием goupdown и godownup отображать случайное число, а затем прибавлять или вычитать на 1, если это необходимо.

public class UpAndDown {


    public UpAndDown() {

    WidgetViewer wv = new WidgetViewer();
    JButton goUpDown = new JButton("Go up/down");
    JLabel leftLabel = new JLabel("0");
    wv.add(goUpDown, 10, 30, 150, 20);
    wv.add(leftLabel, 10, 60, 150, 25);

    JButton goDownUp = new JButton("Go down/up");
    JLabel rightLabel = new JLabel("0");
    wv.add(goDownUp, 10, 120, 150, 20);
    wv.add(rightLabel, 10, 160, 150, 25);

    ButtonIncrement action = new ButtonIncrement(goUpDown);
    goUpDown.addActionListener(action);

    ButtonIncrement action2 = new ButtonIncrement(goDownUp);
    goDownUp.addActionListener(action2);
}

static class ButtonIncrement implements ActionListener {

    private final JButton goUpDownBtn;
    private final JButton goDownUpBtn;

    public ButtonIncrement(JButton buttonToModify) {
        goUpDownBtn = buttonToModify;
        goDownUpBtn = buttonToModify;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int rand = (int) (Math.random() * 10);
        String val = goUpDownBtn.getText();
        //JButton jc = (JButton) e.getSource();
        int newVal = Integer.parseInt(val) + rand;
        goDownUpBtn.setText(String.valueOf(newVal));
        //jc.setText(goDownUpBtn.getText() + " " + val);// get string, convert to int, add rand value. then convert int back to string and set text to string

        /*String val2 = goDownUpBtn.getText();
        int newVal2 = Integer.parseInt(val2) + rand;
        goDownUpBtn.setText(String.valueOf(newVal2));*/


    }
}

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Напишите WidgetViewer GUI, который имеет следующие виджеты:

кнопка с меткой "go вверх / вниз" метка, инициализированная 0 (назовем ее левой меткой) метка, инициализированная 0 (мы назовем ее правой меткой), кнопка с меткой «go вниз / вверх»

Когда нажата кнопка «go вверх / вниз», случайное число между 1 и 10 (включительно) генерируются и добавляются к левой метке, а другое случайное число от 1 до 10 (включительно) генерируется и вычитается из правой метки.

Когда "go вниз / вверх "кнопка нажата, случайное число от 1 до 10 (включительно) генерируется и вычитается из левой метки, а другое случайное число от 1 до 10 (включительно) генерируется и добавляется к правой метке.

Итак, есть несколько важных вещей, которые мы должны извлечь из этого.

  • Значения изначально инициализированы как 0
  • Вам нужно обновить метку, когда кнопка срабатывает
  • Депе Определение того, какая кнопка сработала, определит, какие значения добавляются или вычитаются в

Итак, мы могли бы просто начать с

class IncrementDecrementAction implements ActionListener {

    private final JLabel leftLabel;
    private final JLabel rightLabel;

    private int leftValue = 0;
    private int rightValue = 0;

    public IncrementDecrementAction(JLabel leftLabel, JLabel rightLabel) {
        this.leftLabel = leftLabel;
        this.rightLabel = rightLabel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int rand = (int) (Math.random() * 10) + 1;
        leftValue += rand;
        rand = (int) (Math.random() * 10) + 1;
        rightValue += rand;
        this.leftLabel.setText(Integer.toString(leftValue));
        this.rightLabel.setText(Integer.toString(rightValue));
    }
}

Хорошо, но это только решает проблему в в одном направлении, как насчет «вниз / вверх»?

Ну, мы могли бы написать вторую ActionListener, которая справилась бы с этим, но тогда вам понадобится какая-то модель для поддержания левого и правого значений, чтобы оба слушателя знал, какова текущая стоимость. Не лишенная смысла идея, но для ее работы нужны два дополнительных класса.

Вместо этого мы можем воспользоваться поддержкой ActionEvent s actionCommand и дать каждой кнопке определенное имя c, который мы можем найти, когда действие запускается ...

class IncrementDecrementAction implements ActionListener {

    private final JLabel leftLabel;
    private final JLabel rightLabel;

    private int leftValue = 0;
    private int rightValue = 0;

    public IncrementDecrementAction(JLabel leftLabel, JLabel rightLabel) {
        this.leftLabel = leftLabel;
        this.rightLabel = rightLabel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        int leftRandom = (int) (Math.random() * 10) + 1;
        int rightRandom = (int) (Math.random() * 10) + 1;
        if (e.getActionCommand().equals("upDown")) {
            leftValue += leftRandom;
            rightValue -= rightRandom;
        } else if (e.getActionCommand().equals("downUp")) {
            leftValue -= leftRandom;
            rightValue += rightRandom;
        }

        this.leftLabel.setText(Integer.toString(leftValue));
        this.rightLabel.setText(Integer.toString(rightValue));
    }
}

Это в основном меняет направление расчета на основе источника события - и делает это без необходимости знать, каков источник Событие фактически было (кнопка, пункт меню, связывание клавиш), ему просто все равно.

Вы просто устанавливаете это, применяя соответствующий actionCommand к соответствующему Jbutton, например ...

public class TestPane extends JPanel {

    private JLabel leftLabel;
    private JLabel rightLabel;

    private JButton upDownButton;
    private JButton downUpButton;

    public TestPane() {
        leftLabel = new JLabel("0");
        rightLabel = new JLabel("0");

        upDownButton = new JButton("Up/down");
        downUpButton = new JButton("Down/up");

        upDownButton.setActionCommand("upDown");
        downUpButton.setActionCommand("downUp");

        ActionListener actionListener = new IncrementDecrementAction(leftLabel, rightLabel);

        upDownButton.addActionListener(actionListener);
        downUpButton.addActionListener(actionListener);

        add(leftLabel);
        add(rightLabel);

        add(upDownButton);
        add(downUpButton);
    }

}

Теперь, прежде чем перейти к этой точке, я рассмотрел дюжину или около того идей - моя цель состояла в том, чтобы постараться сделать это как можно проще, не пытаясь представить всю сложность. который, возможно, не нужно добавлять - будьте осторожны - я не знаю, каково намерение упражнения, поэтому я, возможно, пошел в неверном направлении от того, который ваш инструктор пытался заставить вас делать

0 голосов
/ 22 апреля 2020

Модифицированный код:

Я изменил ответ, который вы дали в соответствии с инструкциями для объекта WV, чтобы отобразить GUI, и это правильная версия.

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;



public class UpAndDown extends JPanel {

private JLabel leftLabel;
private JLabel rightLabel;

private JButton upDownButton;
private JButton downUpButton;


public UpAndDown() {


    WidgetViewer wv = new WidgetViewer();

    JButton upDownButton  = new JButton("Up/down");
    wv.add(upDownButton, 10, 30, 150, 20);
    JButton downUpButton = new JButton("Down/up");
    wv.add(downUpButton, 10, 120, 150, 20);

    JLabel leftLabel = new JLabel("0");
    wv.add(leftLabel, 10, 60, 150, 25);
    JLabel rightLabel = new JLabel("0");
    wv.add(rightLabel, 10, 140, 150, 25);

    upDownButton.setActionCommand("upDown");
    downUpButton.setActionCommand("downUp");

    ActionListener actionListener = new IncrementDecrementAction(leftLabel, rightLabel);

    upDownButton.addActionListener(actionListener);
    downUpButton.addActionListener(actionListener);

}

static class IncrementDecrementAction implements ActionListener {

    private final JLabel leftLabel;
    private final JLabel rightLabel;

    private int leftValue = 0;
    private int rightValue = 0;

    public IncrementDecrementAction(JLabel leftLabel, JLabel rightLabel) {
        this.leftLabel = leftLabel;
        this.rightLabel = rightLabel;
    }

    public void actionPerformed(ActionEvent e) {

        int leftRandom = (int) (Math.random() * 10) + 1;
        int rightRandom = (int) (Math.random() * 10) + 1;
        if (e.getActionCommand().equals("upDown")) {
            leftValue += leftRandom;
            rightValue -= rightRandom;
        } else if (e.getActionCommand().equals("downUp")) {
            leftValue -= leftRandom;
            rightValue += rightRandom;
        }

        this.leftLabel.setText(Integer.toString(leftValue));
        this.rightLabel.setText(Integer.toString(rightValue));
    }

}
}
...