我如何让我的动作监听器与我的计算方法进行交流,以便将文本输出到我的GUI?

问题描述 投票:0回答:1

我的任务是创建一个GUI应用程序,该应用程序将使用3位数字输入并返回该数字的总和,反向和数组。我已经创建了所有变量和GUI组件并进行了布局,但是现在在进行计算并将答案返回给GUI时,我陷入了困境。

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

public class Lab02 extends JFrame implements ActionListener
{

   Container content = this.getContentPane();
   SpringLayout layout = new SpringLayout();
   JLabel lblNum = new JLabel("Enter a 3-digit number:");
   JLabel lblSum = new JLabel("Sum:");
   JLabel lblReverse = new JLabel("Reverse:");
   JLabel lblArray = new JLabel("Array:");
   JLabel lblTheSum = new JLabel("");
   JLabel lblTheReverse = new JLabel("");
   JLabel lblTheArray = new JLabel("");
   JLabel lblTextColor = new JLabel("Text color:");
   JButton btnComp = new JButton("Compute");
   JTextField tfInput = new JTextField(5);

   public Lab02()
   {
      content.setLayout(layout);
      this.CreateWindow();
      content.add(lblNum);
      layout.putConstraint(SpringLayout.NORTH, lblNum, 25, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblNum, 25, SpringLayout.WEST, content);

      content.add(lblSum);
      layout.putConstraint(SpringLayout.NORTH, lblSum, 60, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblSum, 25, SpringLayout.WEST, content);

      content.add(lblReverse);
      layout.putConstraint(SpringLayout.NORTH, lblReverse, 95, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblReverse, 25, SpringLayout.WEST, content);

      content.add(lblArray);
      layout.putConstraint(SpringLayout.NORTH, lblArray, 130, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblArray, 25, SpringLayout.WEST, content);

      content.add(lblTextColor);
      layout.putConstraint(SpringLayout.NORTH, lblTextColor, 165, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblTextColor, 25, SpringLayout.WEST, content);

      content.add(lblTheSum);
      layout.putConstraint(SpringLayout.NORTH, lblTheSum, 60, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblTheSum, 175, SpringLayout.WEST, content);

      content.add(lblTheReverse);
      layout.putConstraint(SpringLayout.NORTH, lblTheReverse, 95, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblTheReverse, 175, SpringLayout.WEST, content);

      content.add(lblTheArray);
      layout.putConstraint(SpringLayout.NORTH, lblTheArray, 130, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, lblTheArray, 175, SpringLayout.WEST, content);

      content.add(btnComp);
      layout.putConstraint(SpringLayout.NORTH, btnComp, 200, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, btnComp, 150, SpringLayout.WEST, content);

      content.add(tfInput);
      layout.putConstraint(SpringLayout.NORTH, tfInput, 25, SpringLayout.NORTH, content);
      layout.putConstraint(SpringLayout.WEST, tfInput, 175, SpringLayout.WEST, content);

      btnComp.addActionListener(this);
   }

   public void CreateWindow()
   {
      this.setVisible(true);
      this.setSize(400, 300);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setTitle("Lab02");
   }

   @Override
   public void actionPerformed(ActionEvent e)
   {
      int num = Integer.parseInt(tfInput.getText());
      this.sumTheDigits(num);
      this.reverseTheOrder(num);
      this.createArrayFrom(num);

   }

   public String sumTheDigits(int num)
   {

      int one;
      int two;
      int three;
      int sum;

      one = num % 10;
      two = (num/10) % 10;
      three = num / 100;
      sum = one + two + three;

      String strSum = String.valueOf(sum);

      return strSum;
   }

    public String reverseTheOrder(int num)
   {
      int first;
      int second;
      int third;

      first = num / 100;
      second = (num/10) % 10;
      third = num % 10;

      StringBuffer s = new StringBuffer(3);

      s.append(third);
      s.append(second);
      s.append(first);

      String reverse = s.toString();

      return reverse;
   }

     public int[] createArrayFrom(int num)
   {

      int first;
      int second;
      int third;
      int[] array = new int[3];

      first = num / 100;
      second = (num/10) % 10;
      third = num % 10;

      array[0] = first;
      array[1] = second;
      array[2] = third;

      return array;
   }

   public static void main(String[] args)
   {
      Lab02 gui = new Lab02();
   }



}
java user-interface methods jframe actionlistener
1个回答
0
投票

通过使用model / view / controller模式,您可以使动作监听器与GUI进行通信。很多人都这么说。我将在实践中向您展示如何将代码分成模型,视图和控制器。

我试图不要过多修改您的代码。坦率地说,我认为弹簧布局毫无用处。

无论如何,这是GUI。

enter image description here

这里是我所做的更改,无特定顺序。

  1. 我创建了Lab02Model类,并将所有计算结果都移到了该类中。

  2. 我创建了Lab02Listener类,并将动作侦听器代码移到该类中。

  3. 我通过调用SwingUtilities invokeLater方法启动了GUI。这样可以确保在事件调度线程上创建并执行您的GUI。

  4. 我使用了JFrame。除非您打算重写组件方法之一,否则无需扩展Swing组件。

  5. 我将您的大多数字段定义移至Lab02的构造函数中。仅当需要在类中的多个地方引用字段时,才将其设置为类字段。

  6. 我添加了许多getter方法,因此一个类可以从另一类获取值。请注意这些方法。这是您在类之间进行交流的方式。

无论如何,这是我的代码。

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.SwingUtilities;

public class Lab02 {

    private JLabel lblTheSum = new JLabel("");
    private JLabel lblTheReverse = new JLabel("");
    private JLabel lblTheArray = new JLabel("");

    private JTextField tfInput = new JTextField(5);

    public Lab02() {
        JFrame frame = new JFrame("Lab02");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container content = frame.getContentPane();

        SpringLayout layout = new SpringLayout();
        JLabel lblNum = new JLabel("Enter a 3-digit number:");
        JLabel lblSum = new JLabel("Sum:");
        JLabel lblReverse = new JLabel("Reverse:");
        JLabel lblArray = new JLabel("Array:");
        JLabel lblTextColor = new JLabel("Text color:");
        JButton btnComp = new JButton("Compute");

        content.setLayout(layout);
        content.add(lblNum);
        layout.putConstraint(SpringLayout.NORTH, lblNum, 25, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblNum, 25, SpringLayout.WEST, content);

        content.add(lblSum);
        layout.putConstraint(SpringLayout.NORTH, lblSum, 60, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblSum, 25, SpringLayout.WEST, content);

        content.add(lblReverse);
        layout.putConstraint(SpringLayout.NORTH, lblReverse, 95, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblReverse, 25, SpringLayout.WEST, content);

        content.add(lblArray);
        layout.putConstraint(SpringLayout.NORTH, lblArray, 130, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblArray, 25, SpringLayout.WEST, content);

        content.add(lblTextColor);
        layout.putConstraint(SpringLayout.NORTH, lblTextColor, 165, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblTextColor, 25, SpringLayout.WEST, content);

        content.add(lblTheSum);
        layout.putConstraint(SpringLayout.NORTH, lblTheSum, 60, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblTheSum, 175, SpringLayout.WEST, content);

        content.add(lblTheReverse);
        layout.putConstraint(SpringLayout.NORTH, lblTheReverse, 95, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblTheReverse, 175, SpringLayout.WEST, content);

        content.add(lblTheArray);
        layout.putConstraint(SpringLayout.NORTH, lblTheArray, 130, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, lblTheArray, 175, SpringLayout.WEST, content);

        content.add(btnComp);
        layout.putConstraint(SpringLayout.NORTH, btnComp, 200, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, btnComp, 150, SpringLayout.WEST, content);

        content.add(tfInput);
        layout.putConstraint(SpringLayout.NORTH, tfInput, 25, SpringLayout.NORTH, content);
        layout.putConstraint(SpringLayout.WEST, tfInput, 175, SpringLayout.WEST, content);

        Lab02Model lab02Model = new Lab02Model();
        btnComp.addActionListener(new Lab02Listener(this, lab02Model));

        frame.setSize(400, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public void updateGUI(String sumText, String reverseText, int[] array) {
        lblTheSum.setText(sumText);
        lblTheReverse.setText(reverseText);
        lblTheArray.setText(Arrays.toString(array));
    }

    public JTextField getTfInput() {
        return tfInput;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Lab02();
            }
        });
    }

    public class Lab02Listener implements ActionListener {

        private Lab02 lab02;
        private Lab02Model lab02Model;

        public Lab02Listener(Lab02 lab02, Lab02Model lab02Model) {
            this.lab02 = lab02;
            this.lab02Model = lab02Model;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int num = Integer.parseInt(lab02.getTfInput().getText());
            lab02Model.calculateValues(num);
            lab02.updateGUI(lab02Model.getDigitSum(), lab02Model.getReverseOrder(), lab02Model.getNumArray());
        }

    }

    public class Lab02Model {

        private int[] numArray;

        private String reverseOrder;
        private String digitSum;

        public void calculateValues(int num) {
            this.digitSum = sumTheDigits(num);
            this.reverseOrder = reverseTheOrder(num);
            this.numArray = createArrayFrom(num);
        }

        public int[] getNumArray() {
            return numArray;
        }

        public String getReverseOrder() {
            return reverseOrder;
        }

        public String getDigitSum() {
            return digitSum;
        }

        public String sumTheDigits(int num) {

            int one;
            int two;
            int three;
            int sum;

            one = num % 10;
            two = (num / 10) % 10;
            three = num / 100;
            sum = one + two + three;

            String strSum = String.valueOf(sum);

            return strSum;
        }

        public String reverseTheOrder(int num) {
            int first;
            int second;
            int third;

            first = num / 100;
            second = (num / 10) % 10;
            third = num % 10;

            StringBuffer s = new StringBuffer(3);

            s.append(third);
            s.append(second);
            s.append(first);

            String reverse = s.toString();

            return reverse;
        }

        public int[] createArrayFrom(int num) {

            int first;
            int second;
            int third;
            int[] array = new int[3];

            first = num / 100;
            second = (num / 10) % 10;
            third = num % 10;

            array[0] = first;
            array[1] = second;
            array[2] = third;

            return array;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.