2017-04-27 54 views
0

我试图将标签设置为由读者在实现ActionListener的内部类中接收的字符串。 但我得到一个未知的符号错误。 我怎么能引用该变量在一个内部类如何从内部类的try块中获取字符串

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); 
    } 
    } 
} 
+2

该字符串需要在try块之前声明 – chatton

+1

阅读有关Java变量的作用域。它仅适用于声明范围(和“子范围”) – AxelH

+0

您无法在事件派发线程(EDT)上启动GUI。您无法像在此处那样安全地在主线程上运行GUI。 –

回答

2

这很容易通过应用MVC模式来解决:

您只有一个控制器和一个查看,但你错过了一个共同的模型他们都在工作。

最简单的实施方法是,促进局部变量advice是一个对象的成员变量作为模型

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

和类AdviceListener转换成匿名内部类如一个拉姆达

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

声明你的字符串建议为实例/字段变量:

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); 
    } 
    } 
}