gpt4 book ai didi

java - 尝试压缩转换程序

转载 作者:行者123 更新时间:2023-12-01 11:39:28 24 4
gpt4 key购买 nike

我目前是一名高中生,正在本地大学攻读 DE 类(class)。我正在学习 Java 类(class)并正在从事一个项目。

我仍然是一个初学者,正如您可能在我的代码中看到的那样,并且正在尝试找到压缩我的代码的方法,以便我可以尝试添加更多内容。如果您能帮助我,我将不胜感激!

该程序是不同长度单位的转换程序。我自学了用于此目的的组合框的基础知识,尽管我对此不是很熟悉。

我也不明白为什么转换按钮会延伸这么远。最后,我需要有一个复选框,并且由于我实在想不出它的其他用途,因此我将其放入代码中,并具有您在代码中看到的效果。

注意:只是说;不要让它太复杂,我需要理解它,因为我必须解释程序中做了什么

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

public class Converter extends JFrame {

public static void main(String[] args) {
Converter myFrame = new Converter();
}

private JPanel myP1, myP2, myP3,myP4,myP5;
private JLabel myMessageLabel,myMessageLabel2,myMessageLabel3;
private JButton myButton;
private JComboBox myBox1,myBox2;
private JTextField myText;
private JCheckBox myCheck;

String combo1, combo2;
double inputNumber, convertedNumber;
char check;

public Converter() {
//Dimensions of Frame
final int W_WIDTH = 450;
final int W_HEIGHT = 200;

//Title of Window
setTitle("Unit Converter");
//Size is set
setSize(W_WIDTH, W_HEIGHT);
//Close operation
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set layout of frame
setLayout(new BorderLayout());
//Building and adding panels
buildPanel1();
add(myP1, BorderLayout.NORTH);
buildPanel2();
add(myP2, BorderLayout.CENTER);
buildPanel3();
buildPanel4();
add(myP4, BorderLayout.SOUTH);
buildPanel5();
myP2.add(myP5);
//Making the frame visible on the screen
setVisible(true);

}


private void buildPanel1() {
myMessageLabel = new JLabel("Welcome to the Master Creators Unit Converter!");
myP1 = new JPanel();

myP1.add(myMessageLabel);

}

private void buildPanel2() {
//First Combo Box
String[] units = { " ","Miles", "Feet", "Kilometers", "Meters" };
myP2 = new JPanel();
myBox1 = new JComboBox(units);
myBox1.addActionListener(new ComboBoxListener1());
myP2.add(myBox1);
}

private void buildPanel3() {
//Entering the value to be converted and check box
myP3 = new JPanel();
myMessageLabel3 = new JLabel("Enter a value:");
myText = new JTextField(10);
myCheck = new JCheckBox("Keep checked to convert!");
myCheck.addItemListener(new CheckBoxListener());

myP3.add(myMessageLabel3);
myP3.add(myText);
myP3.add(myCheck);
}

private void buildPanel4() {
//Button to convert
myButton = new JButton("Convert");
myButton.addActionListener(new myButtonListener());
myP4 = new JPanel();
myP4.setLayout(new GridLayout(2,1));
myP4.add(myP3);
myP4.add(myButton);

}
private void buildPanel5() {
//Second Combo Box
String[] units = { " ","Miles", "Feet", "Kilometers", "Meters" };
myP5 = new JPanel();
myMessageLabel2 = new JLabel("to");
myBox2 = new JComboBox(units);
myBox2.addActionListener(new ComboBoxListener2());

myP5.add(myMessageLabel2);
myP5.add(myBox2);

}

private class ComboBoxListener1 implements ActionListener {
public void actionPerformed (ActionEvent e) {
//Giving values to the different selections in the combo box
String selection = (String) myBox1.getSelectedItem();
if (selection.equals("Miles")) {
combo1 = "a";
}
else if (selection.equals("Feet")) {
combo1 = "b";
}
else if (selection.equals("Kilometers")) {
combo1 = "c";
}
else if (selection.equals("Meters")) {
combo1 = "d";
}
else {
combo1 = "z";
}
}
}

private class ComboBoxListener2 implements ActionListener {
public void actionPerformed (ActionEvent e) {
//Giving values to the different selections in the combo box
String selection = (String) myBox2.getSelectedItem();
if (selection.equals("Miles")) {
combo2 = "a";
}
else if (selection.equals("Feet")) {
combo2 = "b";
}
else if (selection.equals("Kilometers")) {
combo2 = "c";
}
else if (selection.equals("Meters")) {
combo2 = "d";
}
else {
combo2 = "z";
}
}
}
private class myButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String input;
//Obtains value entered by user and converts to double
input = myText.getText();
inputNumber = Double.parseDouble(input);
//Checks if the check box is checked before continuing
if(check == 'y') {
//Converts the value from the selected unit to the unit to convert to
if(combo1.equals(combo2)) {
JOptionPane.showMessageDialog(null, inputNumber);
}
else if (combo1 == "a" && combo2 == "b") {
convertedNumber = inputNumber * 5280;
JOptionPane.showMessageDialog(null, convertedNumber + " feet");
}
else if (combo1 == "a" && combo2 == "c") {
convertedNumber = inputNumber * 1.60934;
JOptionPane.showMessageDialog(null, convertedNumber + " kilometers");
}
else if (combo1 == "a" && combo2 == "d") {
convertedNumber = inputNumber * 1609.34;
JOptionPane.showMessageDialog(null, convertedNumber + " meters");
}
else if (combo1 == "b" && combo2 == "a") {
convertedNumber = inputNumber * 0.000189394;
JOptionPane.showMessageDialog(null, convertedNumber + " miles");
}
else if (combo1 == "b" && combo2 == "c") {
convertedNumber = inputNumber * 0.0003048;
JOptionPane.showMessageDialog(null, convertedNumber + " kilometers");
}
else if (combo1 == "b" && combo2 == "d") {
convertedNumber = inputNumber * 0.3048;
JOptionPane.showMessageDialog(null, convertedNumber + " meters");
}
else if (combo1 == "c" && combo2 == "a") {
convertedNumber = inputNumber * 0.621371;
JOptionPane.showMessageDialog(null, convertedNumber + " miles");
}
else if (combo1 == "c" && combo2 == "b") {
convertedNumber = inputNumber * 3280.84;
JOptionPane.showMessageDialog(null, convertedNumber + " feet");
}
else if (combo1 == "c" && combo2 == "d") {
convertedNumber = inputNumber * 1000;
JOptionPane.showMessageDialog(null, convertedNumber + " meters");
}
else if (combo1 == "d" && combo2 == "a") {
convertedNumber = inputNumber * 0.000621371;
JOptionPane.showMessageDialog(null, convertedNumber + " miles");
}
else if (combo1 == "d" && combo2 == "b") {
convertedNumber = inputNumber * 3.28084;
JOptionPane.showMessageDialog(null, convertedNumber + " feet");
}
else if (combo1 == "d" && combo2 == "c") {
convertedNumber = inputNumber * 0.001;
JOptionPane.showMessageDialog(null, convertedNumber + " kilometers");
}
}
}
}
private class CheckBoxListener implements ItemListener {
public void itemStateChanged (ItemEvent e) {
//Checks if the check box is checked
if (myCheck.isSelected()){
check = 'y';
}
else {
check = 'n';
}
}
}
}

最佳答案

如果您的主要目标是使代码更整洁、更明确,那么我建议从以下开始:将单位数据类型从字符串转换为 Java enum 并封装Distance 类中的距离。这样做的好处是:

  • 分离表示和转换逻辑
  • 删除对 combo1combo2 的临时困惑转换
  • 删除长行的 ifelse if 语句
  • 允许在不更改表示逻辑的情况下添加新单元

以下是您可以使用的潜在结构的示例:

public enum Unit {
MILES (1609.344),
FEET (0.3048),
KILOMETRES (1000.0),
METRES (1.0);

private final float toMetreRate;
Unit(float toMetreRate) {
this.toMetreRate = toMetreRate;
}

public float convertTo(float value, Unit unit) {
return value * toMetreRate / unit.toMetreRate;
}
}

public class Distance {
private final Unit unit;
private final float value;

public Distance(float value, Unit unit) {
this.value = value;
this.unit = unit;
}

public Distance convert(Unit newUnit) {
return new Distance(unit.covertTo(value, newUnit), newUnit);
}
}

关于java - 尝试压缩转换程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com