如何将值从一个 JLabel 传输到另一个 JLabel?

2023-12-08

我有这个计算器,但我不知道如何获取其中的值resultpane单击“完成”按钮时到第一个文本框。

我是 Java 新手。我已经尝试这样做,但我一直收到错误。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import javax.swing.AbstractAction;
import static javax.swing.Action.NAME;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestCalculator {

public static void main(String[] args) {
    new TestCalculator();
}

public TestCalculator() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            }

            ResultPane resultPane = new ResultPane();

            JFrame frame = new JFrame("Testing");
            frame.setGlassPane(resultPane);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new CalculatorPane(resultPane));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

public class ResultPane extends JPanel {

    private JLabel result;
    private Timer timer;

    private int xDelta = (Math.random() > 0.5) ? 1 : -1;
    private int yDelta = (Math.random() > 0.5) ? 1 : -1;

    ;

    public ResultPane() {
        setOpaque(false);
        setLayout(null);
        result = new JLabel();
        Font font = result.getFont();
        font = font.deriveFont(Font.BOLD, 26f);
        result.setFont(font);
        add(result);
        timer = new Timer(40, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Point point = result.getLocation();
                point.x += xDelta;
                point.y += yDelta;
                if (point.x < 0) {
                    point.x = 0;
                    xDelta *= -1;
                } else if (point.x + result.getWidth() > getWidth()) {
                    point.x = getWidth() - result.getWidth();
                    xDelta *= -1;
                }
                if (point.y < 0) {
                    point.y = 0;
                    yDelta *= -1;
                } else if (point.y + result.getHeight() > getHeight()) {
                    point.y = getHeight() - result.getHeight();
                    yDelta *= -1;
                }
                result.setLocation(point);
                repaint();
            }

        });
        timer.start();
    }

    public void setResult(Number number) {
        result.setText("Result: " + NumberFormat.getNumberInstance().format(number));
        result.setSize(result.getPreferredSize());
        setVisible(true);
    }

}

public class CalculatorPane extends JPanel {

    private final ResultPane resultPane;

    private final JLabel firstNumberLabel = new JLabel("First Number:");
    private final JLabel secondNumberLabel = new JLabel("Second Number:");

    private final JTextField firstNumberField = new JTextField(5);
    private final JTextField secondNumberField = new JTextField(5);

    public CalculatorPane(ResultPane resultPane) {

        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        this.resultPane = resultPane;

        JPanel fields = new JPanel();
        fields.add(firstNumberLabel);
        fields.add(firstNumberField);
        fields.add(secondNumberLabel);
        fields.add(secondNumberField);

        add(fields, gbc);

        JPanel buttons = new JPanel();
        buttons.add(new JButton(new AddAction()));
        buttons.add(new JButton(new SubtractAction()));
        buttons.add(new JButton(new MultiplyAction()));
        buttons.add(new JButton(new DivideAction()));
        buttons.add(new JButton(new ToText1Action()));

        add(buttons, gbc);

    }

    public class AddAction extends AbstractAction {

        public AddAction() {
            putValue(NAME, "+");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());

                double result = num1 + num2;

                //num1.setResult(firstNumberField);
                resultPane.setResult(result);
            } catch (NumberFormatException exp) {
            }
        }

    }
    public class SubtractAction extends AbstractAction {

        public SubtractAction() {
            putValue(NAME, "-");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());

                double result = num1 - num2;
                resultPane.setResult(result);
            } catch (NumberFormatException exp) {
            }
        }

    }
    public class MultiplyAction extends AbstractAction {

        public MultiplyAction() {
            putValue(NAME, "x");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());

                double result = num1 * num2;
                resultPane.setResult(result);
            } catch (NumberFormatException exp) {
            }
        }

    }
    public class DivideAction extends AbstractAction {

        public DivideAction() {
            putValue(NAME, "/");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());

                double result = num1 / num2;
                resultPane.setResult(result);
            } catch (NumberFormatException exp) {
            }
        }

    }
    public class ToText1Action extends AbstractAction {
        public ToText1Action() {
            putValue(NAME, "Finish");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            try {

                //i would like to put it here


            } catch (NumberFormatException exp) {
            }
        }
    }
}
}

为您的 ResultPane 提供一个新的公共方法,允许您从其 JLabel 中提取文本,如下所示:

  public String getResultText() {
     return result.getText();
  }

然后当您想要获取该字段的文本时调用它:

  public class ToText1Action extends AbstractAction {
     public ToText1Action() {
        putValue(NAME, "Finish");
     }

     @Override
     public void actionPerformed(ActionEvent e) {
         String resultText = resultPane.getResultText();
         double number = // extract number from resultText
         firstNumberField.setText(number);
     }
  }

更好的是,只需将最新结果值存储在作为类的实例字段的双变量中,例如称为lastResult并用它设置第一个数字字段。

请注意,不应有空的 catch 块。


Edit

例如:

public class CalculatorPane extends JPanel {
  private final ResultPane resultPane;
  private final JLabel firstNumberLabel = new JLabel("First Number:");
  private final JLabel secondNumberLabel = new JLabel("Second Number:");
  private final JTextField firstNumberField = new JTextField(5);
  private final JTextField secondNumberField = new JTextField(5);

  private double result = 0.0;   // ****** declared here

  // ***** etc..... *****

  public class DivideAction extends AbstractAction {

     public DivideAction() {
        putValue(NAME, "/");
     }

     @Override
     public void actionPerformed(ActionEvent e) {
        try {
           double num1 = Double.parseDouble(firstNumberField.getText());
           double num2 = Double.parseDouble(secondNumberField.getText());

           result = num1 / num2; // ****** note variable not declared
           resultPane.setResult(result);
        } catch (NumberFormatException exp) {
           // show error message
           // set text fields to "0"
        }
     }

  }

  public class ToText1Action extends AbstractAction {
     public ToText1Action() {
        super("Finish");
        putValue(MNEMONIC_KEY, KeyEvent.VK_F);
     }

     @Override
     public void actionPerformed(ActionEvent e) {
        firstNumberField.setText(String.format("%.2f", result));
     }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将值从一个 JLabel 传输到另一个 JLabel? 的相关文章

随机推荐

  • 使用c#获取系统信息[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何获取计算机的系统信息 系统制造商 系统型号 Bios版本 您可以使用以下方式获取制造商名称 添加引用System Management System Management S
  • java dom getTextContent() 问题

    当我尝试访问我的 xml 数据时doGet我的 servlet 的方法 它只输出直到空白的值 包括整个值 XML 文件
  • 在 AWS iOS SDK 中,如何处理 FORCE_CHANGE_PASSWORD 用户状态

    我已经按照这里的示例进行了操作 https github com awslabs aws sdk ios samples tree master CognitoYourUserPools Sample 将交互式认知登录集成到我的 iOS 应
  • 如何识别图片中的钞票?

    我有一些欧元钞票的图片 账单完全在图像内 并且大多是平坦的 例如变形很小 并且透视倾斜很小 例如完全从钞票上方拍摄的图像 现在我不是图像识别方面的专家 我想实现以下目标 找到钞票的边界框 这样我就可以从图像其余部分的噪声中 剪掉 钞票 弄清
  • Java Graphics2D浮点精确drawOval替代品?

    因此 我尝试绘制一个圆弧并在其圆形端点周围放置一个圆 但由于舍入到最近的像素 我遇到了问题 这在某些情况下是可见的 但并非在所有情况下都是可见的 有没有办法使用浮点和抗锯齿来绘制圆来消除这种舍入误差 您可以运行此代码来查看问题 为了清晰起见
  • max深度和min深度如何与find命令一起使用?

    我想知道最大深度和最小深度如何与 find 命令一起使用 还想知道下面的命令是如何工作的 find mindepth 2 maxdepth 5 name file1 根据find 的手册页 maxdepth levels Descend a
  • 比较 Timer 与 DispatcherTimer

    有什么区别between System Windows Forms Timer and System Windows Threading DispatcherTimer 在什么情况下我们应该使用它们 有什么最佳实践吗 Windows For
  • 使用 h5py 打乱 HDF5 数据集

    我有一个很大的 HDF5 文件 30GB 我需要对每个数据集中的条目 沿着 0 轴 进行洗牌 浏览 h5py 文档我也找不到randomAccess or shuffle功能 但我希望我错过了一些东西 有谁足够熟悉 HDF5 来想出一种快速
  • 请求权限对话框暂停我的活动

    我在里面请求许可onActivityResult我的活动的情况 发生的情况是我的活动在显示请求权限对话框时被暂停 这是为什么 我能以某种方式阻止它吗 我所做的只是以正常方式请求许可 if Build VERSION SDK INT gt B
  • EF Core 3.1.14 重复冷启动

    我们已将一个非常简单的 NET CORE 3 Web API 应用程序部署到 Azure 云 该应用程序是一个 Web API 并与 Azure 中托管的一个非常简单的 SQL 服务器数据库进行通信 我们注意到两个主要的性能问题 所有 AP
  • 替换R中矩阵中的非对角元素(希望这次问得更好)[重复]

    这个问题在这里已经有答案了 好吧 我早些时候问过这个问题 但我因为没有指定任何内容并且没有显示出之前尝试的迹象而受到了 理应的 批评 所以让我再试一次 I m using R and I have a 463 463 matrix What
  • 处理来自多个选择字段的数据

    我有一个多重选择字段 设计如下
  • 编辑多个未发布的 Go 模块的本地副本

    是只有我一个人还是使用未发布的 go 模块非常痛苦 https go dev doc modules managing dependency tmp 9 https groups google com g golang nuts c 9Mf
  • 如何访问 Apexchart 的 dataPointSelection 函数上的值

    如何通过单击工具提示来访问 Apex 图表的数据值 我不想要索引 我需要这个值 我如何访问该值
  • 流口水基于时间的限制和“现在”

    我们正在尝试写一个流口水 上面写着 如果事件发生在上周 则执行后果 我们有表示事件发生时间的常规 java 日期对象 但我们不确定如何在流口水的 LHS 中表达我们希望该日期对象在上周发生 重要的是 一周的时间跨度是任意的 它可以随时更改为
  • Matlab使用bar时右侧有空白

    我使用下面的代码来保存图形 fig1 figure visible off b bar bar res x a b c d e f g h i j k l m n o p q r s t u set gca XTickLabel x XTi
  • 如何最好地实现自定义类型的 Equals?

    假设有一个 Point2 类 并且以下等于 public override bool Equals object obj public bool Equals Point2 obj 这是 Effective C 3 中所示的内容 publi
  • ASP 奇怪的未指定错误 - 80004005

    我必须在一个已经制作好的网站上工作 只需添加一些小模块 当我更新时 不同的子文件夹中有许多名为 myDB mdb 的文件 我想确保我的应用程序连接正确的数据库 所以我开始重命名子文件夹 在其中一个子文件夹中 我刷新了 主站点和我的停止工作
  • Zend Framework 2 过滤/验证内容数组

    如何将过滤器应用于包含数组内容的字段元素 例如 this gt add name gt tags type gt text filter gt array array name gt StripTags array name gt Stri
  • 如何将值从一个 JLabel 传输到另一个 JLabel?

    我有这个计算器 但我不知道如何获取其中的值resultpane单击 完成 按钮时到第一个文本框 我是 Java 新手 我已经尝试这样做 但我一直收到错误 import java awt BorderLayout import java aw