【问题标题】:Currency Exchange API Java GUI货币兑换 API Java GUI
【发布时间】:2020-07-27 14:00:20
【问题描述】:

我对这个级别的编程相当陌生,我想知道是否有人可以帮助我。

所以我正在尝试使用 Java 创建一个货币兑换应用程序,但我在更新 GUI 上的值以反映 API 上的新值时遇到了问题。本质上,这些值经常更改并显示在控制台上,但是,GUI 值永远不会更新并保持不变。

我认为 ActionListener 可以帮助解决这个问题,但要么我没有正确实施它,要么我没有用谷歌搜索并正确提出解决方案。

提前感谢您的帮助:)

这是我的代码: GUI.java

public class GUI extends JFrame {
    
    static Arb arb = new Arb();

    private JPanel contentPane;
  public static void main(String[] args) throws IOException, InterruptedException {
        
        ActionListener taskPerformer = new ActionListener() {
             public void actionPerformed(ActionEvent evt) {
                 try {
                    arb.runUpdate_fx("anAPI");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
         };
         Timer timer = new Timer(100 ,taskPerformer);
         timer.setRepeats(true);
         timer.start();
 
         Thread.sleep(5000);
        
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI frame = new GUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public GUI() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setBounds(100, 100, 1121, 765);
      contentPane = new JPanel();
      contentPane.setBackground(Color.BLACK);
      contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
      contentPane.setLayout(new BorderLayout(0, 0));
      setContentPane(contentPane);

      JTextPane FXRate = new JTextPane();
      FXRate.setForeground(new Color(255, 255, 255));
      FXRate.setBackground(new Color(0, 0, 0));
      FXRate.setEditable(false);
      FXRate.setFont(new Font("Tahoma", Font.BOLD, 11));
      panel_1.setLayout(new FlowLayout(FlowLayout.LEADING, 5, 5));
      FXRate.setText("FX Rates\r\n\r\nEUR-AUD FX Rate: " + arb.fxEURAUD + "\r\nEUR-USD FX Rate: " + arb.fxEURUSD);
      panel_1.add(FXRate);
    }
}

结果: 欧元兑澳元:1.646659 一段时间后 欧元兑澳元:1.646659

预期结果: 欧元兑澳元:1.646659 一段时间后 欧元兑澳元:1.80102

【问题讨论】:

  • 嗯,你永远在任何地方更新你的用户界面。您需要调用 FXrate.setText("My new string");在其上设置新文本。在设置初始字符串之后,你永远不会这样做。
  • Dwarsaw,我冒昧地编辑了您在请求中包含的 data.fixer.io API 密钥。这很可能是偶然的,但您应该非常小心,切勿将任何 API 密钥发布到任何公共场所的任何服务。这包括在 Github 源代码和 Stack Overflow 问题中。公开此类 APÏ 密钥可能会让其他人以您的名义提出请求,并可能会花费您大量的服务成本。
  • @Nzall Gotcha,我刚刚注册了一个免费帐户,并没有真正为它费心,但谢谢,以后不会再使用它了。
  • @Dwarsaw 否。更新变量的内容根本不会更新面板上的文本。你真的需要打电话给JTextPane.SetText("my New String");设置另一个文本。引用是按值传递的,而不是作为指针传递的。
  • @Dwarsaw 你可能想看看codereview.stackexchange.com

标签: java api rest currency


【解决方案1】:

在 Java 中引用是按值传递的

JTextField textField = new JTextField();
String text = "Initial text";
textField.setText(text); // no displays "Initial text";
text = "Updated text"; // doesn't change what the panel displays
// the panel still holds a reference to the old text
textField.setText(text); // updates the reference the panel holds to your new text

在您的事件监听器中,您需要使用更新后的字符串调用setText 以实际使文本字段显示。

【讨论】:

    【解决方案2】:

    您的计时器和事件处理程序看起来不错,但更新方法仅将新值获取到 Arb 对象;没有任何东西可以将这些值放入 GUI 中。您可以在事件处理程序中显式执行此操作。更新方法返回后。要启用它,您可能需要将 FXRate 设为成员变量,以便您可以从操作侦听器访问它。

    【讨论】:

    • 创建成员变量本质上只是为 GUI.java 创建一个全局/静态变量吗?
    • @Dwarsaw 是的,从某种意义上说,我相信您理解任务,但不是,因为您的语言是错误的(Java 没有全局变量,而“静态”意味着其他东西);但是,是的,在 GUI 类主体的范围内创建一个变量。
    • 所以如果我做对了,没有全局变量,但你可以拥有其他类可以引用的公共变量,对吗?静态是特定于类的,从某种意义上说是“静态的”,对吗?
    • 我不能在这里详细介绍所有细节,但是是的,公共成员变量存在于类或对象的范围内,并且对所有其他代码都是可见的。 “静态”成员(公共或非公共)的范围为类,并由该类的所有实例共享,而非静态成员属于每个单独的实例。避免 public 和 static ,除非你真的需要它们。
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2013-08-05
    • 2012-06-10
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2018-06-23
    相关资源
    最近更新 更多