我的任务是创建一个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();
}
}
通过使用model / view / controller模式,您可以使动作监听器与GUI进行通信。很多人都这么说。我将在实践中向您展示如何将代码分成模型,视图和控制器。
我试图不要过多修改您的代码。坦率地说,我认为弹簧布局毫无用处。
无论如何,这是GUI。
这里是我所做的更改,无特定顺序。
我创建了Lab02Model类,并将所有计算结果都移到了该类中。
我创建了Lab02Listener类,并将动作侦听器代码移到该类中。
我通过调用SwingUtilities invokeLater方法启动了GUI。这样可以确保在事件调度线程上创建并执行您的GUI。
我使用了JFrame。除非您打算重写组件方法之一,否则无需扩展Swing组件。
我将您的大多数字段定义移至Lab02的构造函数中。仅当需要在类中的多个地方引用字段时,才将其设置为类字段。
我添加了许多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;
}
}
}