2017-12-02 2 views
0

Ich möchte wissen, wie kann ich meine JTextArea global und wie kann ich das schreiben mit dem Ergebnis, das ich als eine ganze Zahl bekommen?Java, wie man JTextArea aus verschiedenen Klassen zugänglich macht und in Integer schreibt

Ich versuche, Programm für Warteschlangen mit verknüpften Link-Implementierung zu tun, aber ich verwende nicht tatsächlich die LinkedList Klasse. Ich habe zwei verschiedene Klassen in meinem Projekt. Es gibt eine Klasse, die deneme2 ist. In dieser Klasse habe ich die Queue-Methoden. In der zweiten Klasse habe ich die JFrame, also würde ich gerne meine Enqueue und Enqueue Ergebnisse in bekommen. Bis jetzt konnte ich nur println benutzen, aber ich schaffe es nicht, es in die zu bekommen.

Das ist mein deneme4 Klasse

public class Deneme4 extends JFrame { 
public static void main(String a[]) throws FileNotFoundException { 
    SecondFrame frame = new SecondFrame(); 

}} 

Dies ist die Queue Klasse für die GUI Ich habe versucht,

public class Queue { 

public static interface MessageOutput { 

    void appendMessage(String message); 

    void appendHead(String message); 
} 

private MessageOutput msgOutput = new MessageOutput() { 
    @Override 
    public void appendMessage(String message) { 
     System.out.println(message); 
    } 

    @Override 
    public void appendHead(String head) { 
     System.out.println(head); 
    } 
}; 

public void setMessageOutput(MessageOutput value) { 
    msgOutput = value; 
} 

public void setHeadOutput(MessageOutput value) { 
    msgOutput = value; 
} 

private Node front, rear; 
private int currentSize; 

private class Node { 

    int data; 
    Node next; 
} 

public Queue() { 
    front = null; 
    rear = null; 
    currentSize = 0; 
} 

public boolean isEmpty() { 
    if (currentSize == 0) { 
     msgOutput.appendMessage("Que is Empty\n"); 
    } 
    return currentSize == 0; 
} 

public int dequeue() { 
    int data = front.data; 
    front = front.next; 
    if (isEmpty()) { 
     rear = null; 
    } 
    currentSize--; 
    msgOutput.appendMessage(data + " removed from the queue\n"); 

    return data; 
} 

public int enqueue(int data) throws FileNotFoundException { 
    Node oldRear = rear; 
    rear = new Node(); 
    rear.data = data; 
    rear.next = null; 
    if (isEmpty()) { 
     front = rear; 
    } else { 
     oldRear.next = rear; 
    } 
    currentSize++; 
    msgOutput.appendMessage(data + " added to the queue\n"); 
    return data; 
} 

public int queueSize() { 
    msgOutput.appendMessage("Size of the Que is" + currentSize + "\n"); 
    return currentSize; 
} 

public int getHead() { 
    int data = front.data; 
    msgOutput.appendHead("Head of the Que is " + data + "\n"); 
    return data; 
}} 

und das ist mein QueueFrame zu machen, die ich will, wenn die Schaltfläche angeklickt haben die Ausgänge Wert zu txt1, aber scheint es nicht zu tun

public class QueueFrame extends JFrame implements Queue.MessageOutput { 

private JTextArea txt1; 
private JTextArea txt2; 
private JTextArea txt3; 
private JButton b1; 
private JButton b2; 
private Queue queue = new Queue(); 

public static interface MessageOutput { 

    void appendMessage(String message); 

    void appendHead(String message); 
} 

private MessageOutput msgOutput = new MessageOutput() { 
    @Override 
    public void appendMessage(String message) { 
     System.out.println(message); 
    } 

    @Override 
    public void appendHead(String head) { 
     System.out.println(head); 
    } 
}; 

public void setMessageOutput(MessageOutput value) { 
    msgOutput = value; 
} 

public void setHeadOutput(MessageOutput value) { 
    msgOutput = value; 
} 

@Override 
public void appendHead(String head) { 
    txt2.append(head); 
} 

public QueueFrame() throws FileNotFoundException { 

    JFrame frame = new JFrame(); 
    b1 = new JButton("Load up the Que"); 
    b1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      try { 
       Scanner s = new Scanner(new File("list.txt")); 
       while (s.hasNext()) { 
        queue.setMessageOutput((Queue.MessageOutput) queue. 
        queue.enqueue(s.nextInt()); 
       } 
       s.close(); 
       queue.queueSize(); 
       queue.getHead(); 
      } catch (FileNotFoundException ex) { 
       Logger.getLogger(QueueFrame.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 
    b2 = new JButton("Head of the Que"); 
    b2.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      queue.getHead(); 
     } 
    }); 

    txt1 = new JTextArea(); 
    txt2 = new JTextArea(); 
    txt3 = new JTextArea(); 

    txt1.setEditable(false); 
    txt2.setEditable(false); 
    txt3.setEditable(true); 

    b1.setBounds(50, 100, 180, 100); 
    b2.setBounds(50, 300, 180, 100); 
    txt1.setBounds(600, 100, 200, 600); 
    txt2.setBounds(300, 300, 180, 100); 
    txt3.setBounds(300, 100, 180, 100); 
    frame.add(b1); 
    frame.add(b2); 
    frame.add(txt1); 
    frame.add(txt2); 
    frame.add(txt3); 
    frame.setLayout(null); 
    frame.setSize(1000, 1500); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

}} 
+0

"* ho kann ich meine JTextArea global machen" * - Sie sollten so weit wie möglich vermeiden, globale Variablen zu jeder Zeit zu verwenden. Sie sollten immer vorsichtig sein, Benutzeroberflächenelemente verfügbar zu machen, da andere von ihnen auf unerwartete Weise geändert werden können (z. B. wenn Sie sie aus ihrem Container entfernen). Stattdessen konzentrieren sich auf die Verwendung von „Beobachter-Muster“, mit denen Sie Interesse Klassen registrieren, die die Meldungen erzeugen kann, wenn einige Zustand – MadProgrammer

Antwort

0

Es gibt viele mögliche Lösungen für dieses Problem. Dies ist die Art und Weise, dass ich es Ansatz würde:

eine Schnittstelle erstellen MessageOutput innerhalb der Klasse deneme2 wie folgt aufgerufen:

public class deneme2 { 
    public static interface MessageOutput { 
     void appendMessage(String message); 
    } 
} 

Und in der gleichen Klasse, müssen Sie einen Verweis auf die MessageOutput, so dass Sie anhängen Nachricht an sie. Und seien wir bis zu einem gewissen Standardimplementierung für den Fall initialisieren niemand gesetzt später:

private MessageOutput msgOutput = new MessageOutput() { 
    @override 
    public void appendMessage(String message) { 
     System.out.println(message); 
    } 
}; 

und so benötigen Sie einen Setter zum msgOutput Feld:

public void setMessageOutput(MessageOutput value) { 
    msgOutput = value; 
} 

Und so können Sie jetzt alle println ändern Code MessageOutput der appendMessage() -Methode zu verwenden:

public int dequeue() { 
    . . . 

    msgOutput.appendMessage(data + " removed from the queue"); 
    return data; 
} 

Dann lassen Sie Mainframe implementiert deneme2.MessageOutput. Beachten Sie, dass Sie nicht mehr die JTextArea als lokale Variable verwenden können, müssen Sie es ein Attribut der Mainframe machen:

public class MainFrame implements deneme2.MessageOutput { 
    @override 
    public void appendMessage(String message) { 
     txt2.append(message); 
    } 
} 

Und schließlich, aktualisieren Sie die Methode main() Mainframe bis zum deneme2 Instanz weitergeben müssen:

MainFrame frame = new MainFrame(); 
queue.setMessageOutput(frame); 

Und Sie sollten die Warteschlange verarbeiten, nachdem der MainFrame erstellt wurde.

+0

ändert und auch, wie kann ich JTextArea als Attribut von Mainframe machen? –

+0

Ich habe alles gemacht, das einzige Problem, das ich habe, ist, wenn ich Schlange steh.setMessageOutput (Rahmen); dies in der Hauptmethode gibt es Fehler mit der Warteschlange –

+0

Können Sie die Fehlermeldung anzeigen? –

Verwandte Themen