2017-04-27 56 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); 
    } 
    } 
}