Java Swing使用一个主框架获取其他组件
Java Swing using a main frame to get other components
下面是一段反转文本的代码。
TextFrame Class the main frame of my 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 Class Panel which handles the input and output
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();
}
}
Controls class
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 Class which is my event handler
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
}
}
我想在我的事件处理程序中使用大型机 class 来调用这些组件,但这不起作用。
我在名为 TextFrame 的主框架中有获取和设置方法。
我的问题是如何使用我的事件处理程序 class 使用主框架 cato 从 GUI 获取输入并反转此输入。
在 new JButton(...) 之后,调用按钮上的 setActionCommand。否则,您只需设置标签,即使触发了侦听器,侦听器也不会获得按钮的 ActionCommand。
您从未使用任何 TextFrame 实例设置 Controls 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
下面是一段反转文本的代码。
TextFrame Class the main frame of my 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 Class Panel which handles the input and output
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();
}
}
Controls class
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 Class which is my event handler
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
}
}
我想在我的事件处理程序中使用大型机 class 来调用这些组件,但这不起作用。
我在名为 TextFrame 的主框架中有获取和设置方法。
我的问题是如何使用我的事件处理程序 class 使用主框架 cato 从 GUI 获取输入并反转此输入。
在 new JButton(...) 之后,调用按钮上的 setActionCommand。否则,您只需设置标签,即使触发了侦听器,侦听器也不会获得按钮的 ActionCommand。
您从未使用任何 TextFrame 实例设置 Controls 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