这里我有下面的代码来反转文本。
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输入来使用我的事件处理程序类并反转此输入。
答案 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。