【问题标题】:How to get a string from a try block in an inner class如何从内部类的 try 块中获取字符串
【发布时间】:2017-04-27 10:18:43
【问题描述】:

我正在尝试将标签设置为读者收到的字符串,在实现 ActionListener 的内部类中。 但我得到一个未知的符号错误。 如何在内部类中引用该变量

import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class DailyAdviceClient {
  JLabel label;
  JButton button;
  JFrame frame;
  JPanel mainPanel;

  public void gui() {
    frame = new JFrame("Daily Advice Client");
    button = new JButton("Get Advice");
    label = new JLabel("Text");
    mainPanel = new JPanel();
    mainPanel.add(button);
    mainPanel.add(label);

    button.addActionListener(new AdviceListener());
    frame.getContentPane().add(BorderLayout.CENTER, mainPanel);

    frame.setSize(300,400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

  }
  public void go() {
    try {
      Socket s = new Socket("127.0.0.1", 4242);

      InputStreamReader streamReader = new InputStreamReader(s.getInputStream());
      BufferedReader reader = new BufferedReader(streamReader);

      String advice = reader.readLine();
      System.out.println("Today you should: " + advice);
      reader.close();
    }
    catch (IOException e) {
      System.out.println("Hayt tumhari ki");
      System.out.print("I didn't think we would get to this stage. Please ");
      System.out.println("kill the developer. \n");
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    DailyAdviceClient client = new DailyAdviceClient();
    client.go();
    client.gui();
  }

  public class AdviceListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      label.setText(advice);
    }
  }
}

【问题讨论】:

  • 字符串需要在try块前声明
  • 了解 Java 变量的范围。它只存在于它被声明的范围(和“子范围”)
  • 您未能在事件调度线程 (EDT) 上启动 GUI。您不能像这里那样在主线程上安全地运行 GUI。

标签: java swing inner-classes


【解决方案1】:

这可以通过应用 MVC 模式轻松解决:

你只有一个Controller和一个View,但是你缺少一个共同的Model,它们都可以工作。

最简单的实现是将局部变量advice 提升为对象成员变量,作为模型

public class DailyAdviceClient {
  private String advice;
  // ...
  advice = reader.readLine();
  // ...

并将AdviceListener 类转换为匿名内部类 作为lambda

button.addActionListener(ae->label.setText(advice));

【讨论】:

    【解决方案2】:

    将您的字符串 advice 声明为实例/字段变量:

    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    public class DailyAdviceClient {
      JLabel label;
      JButton button;
      JFrame frame;
      JPanel mainPanel;
      String advice;
    
      public void gui() {
        frame = new JFrame("Daily Advice Client");
        button = new JButton("Get Advice");
        label = new JLabel("Text");
        mainPanel = new JPanel();
        mainPanel.add(button);
        mainPanel.add(label);
    
        button.addActionListener(new AdviceListener());
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
    
        frame.setSize(300,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    
      }
      public void go() {
        try {
          Socket s = new Socket("127.0.0.1", 4242);
    
          InputStreamReader streamReader = new InputStreamReader(s.getInputStream());
          BufferedReader reader = new BufferedReader(streamReader);
    
          advice = reader.readLine();
          System.out.println("Today you should: " + advice);
          reader.close();
        }
        catch (IOException e) {
          System.out.println("Hayt tumhari ki");
          System.out.print("I didn't think we would get to this stage. Please ");
          System.out.println("kill the developer. \n");
          e.printStackTrace();
        }
      }
    
      public static void main(String[] args) {
        DailyAdviceClient client = new DailyAdviceClient();
        client.go();
        client.gui();
      }
    
      public class AdviceListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
          label.setText(advice);
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 2012-02-03
      • 1970-01-01
      • 2014-12-08
      • 2015-07-07
      • 2013-03-29
      • 1970-01-01
      • 2019-07-03
      • 2023-03-23
      相关资源
      最近更新 更多