Java actionPerformed在调整GUI大小之前不会添加更改后的标签



我是一名试图学习java的高中生,任何帮助或建议都将不胜感激。我按下按钮后,代码不会设置文本。在我出于某种原因更改GUI的大小之前,actionPerformed不会执行它应该执行的操作。当我运行它并按下按钮a时。弹出,但没有其他内容,如果你运行它,你就会看到我在说什么。我认为它在表演过程中会因为某种原因而停止,但我真的只是猜测。非常感谢。

import java.awt.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JFrame;
public class GUI extends JFrame implements ActionListener{
public TextField mpgEnter;
public Label lblResult;
public Button btnEnter;
public TextField gasPriceEnter;
public TextField distanceEnter;
public double mpg;
public double distanceTravel;
double priceOfgas;
public GUI() {

setTitle("GUI Test");

setSize(280, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Label lbl2 = new Label("MPG ||");
add(lbl2);
mpgEnter = new TextField(5);
Label lbl3 = new Label("Price of gas ||");
add(lbl3);
gasPriceEnter = new TextField(5);
Label lbl4 = new Label("Distance");
add(lbl4);
distanceEnter = new TextField(5);
setLayout(new FlowLayout());
add(mpgEnter);
add(gasPriceEnter);
add(distanceEnter);
// add button
btnEnter = new Button("Enter");
btnEnter.addActionListener(this);
add(btnEnter);
//add label

//setResizable(false);
lblResult = new Label("");
add(lblResult);
setVisible(true);
}
public static double calculateGPM(double mpg, double gas,double distance){
    double gasPerMile = gas/mpg;
    double cost1 = gasPerMile * distance;
    NumberFormat formatter = new DecimalFormat("#0.00"); 
    double costFinal = Double.parseDouble(formatter.format(cost1));
    return costFinal;
}
@Override
public void actionPerformed(ActionEvent e) {
    //System.out.print(test.getText());
    mpg = Double.parseDouble(mpgEnter.getText());
    priceOfgas= Double.parseDouble(gasPriceEnter.getText());
    distanceTravel = Double.parseDouble(distanceEnter.getText()); 
    lblResult.setText("The price for your trip is: $" + calculateGPM(mpg, priceOfgas, distanceTravel));
    add(lblResult);
    }
    }

首先,您要将重量较重的组件与重量较轻的组件混合,这将导致问题层出不穷,最好避免。

代替:

  • Label使用JLabel
  • TextField使用JTextField
  • Button使用JButton

您的主要问题是,当文本更改时,您的容器没有更新,这是java.awt.Label的限制,只要将其更改为javax.swing.JLabel,就会在标签的文本更改后自动重新验证容器。

请参阅。。。

  • 使用JFC/Swing创建GUI
  • 在容器中布置零部件
  • 我应该避免在JavaSwing中使用set(Preferred|Maximum|Minimum)Size方法吗

有关更多详细信息,

lblResult标签用"初始化。设置值(一个大文本)时,在流布局中没有空间放置该值。

我认为你必须为结果标签设置一个更详细的布局或最小宽度:

标签宽度:

  setSize(400, 400);
  lblResult.setPreferredSize(new Dimension(200, 20));

布局示例:

    final JPanel north = new JPanel(new FlowLayout());
    north.add(mpgEnter);
    north.add(gasPriceEnter);
    north.add(distanceEnter);
    // add button
    btnEnter = new Button("Enter");
    btnEnter.addActionListener(this);
    north.add(btnEnter);
    // add label
    add(north, BorderLayout.NORTH);
    // setResizable(false);
    lblResult = new Label("");
    lblResult.setPreferredSize(new Dimension(200, 20));
    add(lblResult, BorderLayout.CENTER);

最新更新