2017-02-03 3 views
0

Hier habe ich diesen Code unten, der einen Text umkehrt.Java Swing mit einem Hauptrahmen, um andere Komponenten zu erhalten

Textframe-Klasse der Hauptrahmen meiner GUI

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 


public class TextFrame extends JFrame implements ActionListener{ 
    private Controls theControls; 
    private ReverseText theReverseText; 
    private InputOutputPanel theInputOutputPanel; 

    public TextFrame(){ 

    this.getContentPane().setLayout(new BorderLayout()); 

    theInputOutputPanel = new InputOutputPanel(); 
    theReverseText = new ReverseText(this); 
    theControls = new Controls(theReverseText); 

    this.getContentPane().add(theInputOutputPanel, BorderLayout.NORTH); 

    this.getContentPane().add(theControls, BorderLayout.SOUTH); 
    this.pack(); 
    this.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 


    public Controls getControls(){ 
    return this.theControls; 
    } 

    public InputOutputPanel getInputOutPanel(){ 
     return this.theInputOutputPanel; 

    } 

    public static void main(String[] args) { 
     // All we need to do is create the frame, as the constructor does everything required. 
     TextFrame theFrame = new TextFrame(); 
//  theFrame.setSize(150, 150); 
//  theFrame.setVisible(true); 
    } 

} 

Eingabe-Ausgabe-Class-Panel, das die Eingangs- und Ausgangs

import java.awt.GridLayout; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class InputOutputPanel extends JPanel { 

    private JTextField input; 
    private JTextField output; 
    private JTextField situation; 

    public InputOutputPanel() { 

     this.setLayout(new GridLayout(2, 2)); 
     this.add(new JLabel("header")); 
     this.add(situation = new JTextField("Situation")); 
     this.add(input = new JTextField("input text here")); 
     this.add(output = new JTextField()); 


    } 

    public void setSituation(String sit){ 
     situation.setText(sit); 

    } 

    public void setOutPut(String s){ 
    output.setText(s); 
    } 

    public String getInput(){ 
     return input.getText(); 


    } 
} 

Kontrollen Klasse behandelt

import javax.swing.JButton; 
import javax.swing.JPanel; 


public class Controls extends JPanel { 
    private ReverseText reverseText; //the Event handler 
    private TextFrame theTextFrame; // the main frame to display the text 

    public Controls(ReverseText reverseText){ 
    this.reverseText = reverseText; 

    reverseText = new ReverseText(theTextFrame); 

    JButton reversetheTextButton;  

    this.add(reversetheTextButton = new JButton("Text-Reverse")); 
    reversetheTextButton.addActionListener(reverseText); 


    } 

} 

ReverseText Klasse, die Handler mein Fall ist

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

import java.awt.event.ActionListener; 

public class ReverseText implements ActionListener { 

    private TextFrame theTextFrame; 
    private InputOutputPanel inputOutPanel; 


    public ReverseText(TextFrame theTextFrame) { 
     this.theTextFrame = theTextFrame; 



    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
    String buttonAction = event.getActionCommand(); 

    // trying to use the mainframe to get other components 

    inputOutPanel = theTextFrame.getInputOutPanel(); // but this line complaining about null pointer error 

    String input = inputOutPanel.getInput(); 


    if (buttonAction.equals("Text-Reverse")) 
     System.out.println("yes"); 
     inputOutPanel.setSituation(buttonAction); 

     //Reverse The Text and send it to the Output 
     String reversedText = new StringBuffer(input).reverse().toString(); 

     // 
     inputOutPanel.setOutPut(reversedText); 

    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 

    } 

} 

Ich möchte den Mainframe in meinem Event-Handler-Klasse verwenden, um diese Komponenten zu nennen butthis nicht funktioniert.

Ich habe Methoden in meinem Hauptrahmen namens TextFrame bekommen und gesetzt.

Meine Frage ist, wie kann ich meine Event-Handler-Klasse verwenden, der Hauptrahmen cato nimmt Eingabe von der GUI und diese Eingabe rückgängig machen.

Antwort

3

Sie setzen das Feld "Controls TextFrame" nie mit einer beliebigen TextFrame-Instanz. Sie müssen es über einen Parameter an den Controls-Konstruktor übergeben, genau wie das Modell. ändern

public class Controls extends JPanel { 
    private ReverseText reverseText; //the Event handler 
    private TextFrame theTextFrame; // the main frame to display the text 

    // **** note changes to constructor 
    public Controls(ReverseText reverseText, TextFrame theTextFrame){ 
     this.reverseText = reverseText; 
     this.theTextFrame = textFrame; // ***** added 

     reverseText = new ReverseText(theTextFrame); 

Dann:

theControls = new Controls(theReverseText, this); // **** note change 
+0

wow. Es klappt! Vielen Dank –

+0

@EvelynDrew: Gern geschehen. Für was es sich jedoch lohnt, sollte das Control * kein JPanel oder Hafen View-Komponenten wie JButtons sein. –

0

nach new JButton (...), rufen Sie setActionCommand auf die Schaltfläche. Andernfalls legen Sie nur die Bezeichnung fest, und der Listener erhält auch dann keinen ActionCommand, wenn der Listener ausgelöst wird.

+0

die Sache ist meine Tasten in Ordnung arbeiten (geprüft und es ist in der Lage eine Linie mit System .out drucken), weil ich eine Zeichenfolge mit dem Befehl an den angepasst bekommen Name der Schaltfläche in meiner Listener-Klasse, ich möchte in der Lage sein, den Hauptrahmen zu verwenden, um diese anderen Komponenten zu erhalten, und diese Felder dann entsprechend einzustellen? –

Verwandte Themen