2017-02-03 61 views
0

这里我有下面这段代码反转文本。使用主框架获取其他组件的Java Swing

TextFrame类我的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); 
    } 

} 

的inputOutput类面板,其处理输入和输出

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


    } 
} 

控件类

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类,这是我的事件处理程序

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 

    } 

} 

我想使用的主机在我的事件处理程序类调用这些组件但是这场不工作。

我已经在我的主框架中获取并设置了一个名为TextFrame的方法。

我的问题是如何使用我的事件处理程序类使用主框架cato从GUI中取得输入并且反转此输入。

回答

3

您从不设置任何TextFrame实例的控件TextFrame字段。您需要通过参数将它传递到Controls构造函数,就像您做模型一样。

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

然后改变:

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

哇。有用!非常感谢 –

+0

@EvelynDrew:不客气。对于它的价值,控件不应该是一个JPanel,也不应该包含像JButton这样的组件。 –

0

在新的JButton(...)之后,在按钮上调用setActionCommand。否则,您只需设置标签,即使侦听器被触发,侦听器也不会获得按钮的ActionCommand。

+0

事情是我的按钮正常的工作(检查,它能够使用系统的.out打印线),因为我使用的字符串来获得匹配的命令我的侦听器类中的按钮的名称,我想能够使用主框架来获取这些其他组件,然后相应地设置这些字段? –