2017-04-27 2 views
0

Ich versuche, die Bezeichnung als die Zeichenfolge vom Leser empfangen, in einer inneren Klasse, die ActionListener implementiert. Aber ich bekomme einen unbekannten Symbolfehler. Wie könnte ich verweisen, die Variable in einer inneren KlasseWie bekomme ich eine Zeichenfolge von einem try-Block in einer inneren Klasse

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

Die Zeichenfolge muss vor dem try-Block deklariert werden – chatton

+1

Lesen Sie über den Gültigkeitsbereich einer Variablen für Java. Es wird nur für den Bereich vorhanden sein, in dem es deklariert wurde (und der "Unterbereich"). – AxelH

+0

Sie konnten die GUI für den Event Dispatch Thread (EDT) nicht starten. Sie können die GUI im Hauptthread nicht sicher ausführen, wie Sie es hier getan haben. –

Antwort

2

Diese leicht durch Anwendung des MVC-Muster gelöst werden könnte:

Sie haben nur einen Controller und einen View, aber Sie fehlen eine gemeinsame Modell beide arbeiten an.

Die einfachste Implementierung wäre die lokale Variable zu fördern advice ein Objekt Membervariable dient als Modell zu sein:

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

und Umwandlung der Klasse AdviceListener in eine anonyme innere Klasse als ein Lambda:

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

Zeichenfolge deklarieren Beratung als Instanz/Feldvariable:

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