Java Swing使用主框架来获取其他组件

时间:2017-02-03 18:32:42

标签: java swing awt

这里我有下面的代码来反转文本。

  

TextFrame Class我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的方法。

我的问题是如何使用来自GUI的主框架cato take输入来使用我的事件处理程序类并反转此输入。

2 个答案:

答案 0 :(得分:3)

您永远不会将Controls 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

答案 1 :(得分:0)

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