当我在类别按钮之后单击选择按钮时,为什么不打印String而不打印null?

用户
package simpleclass;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;

public class SimpleClass extends BaseClass {
    JButton b1 = new JButton("Category");
    JButton b2 = new JButton("Select");
    JFrame f = new JFrame();

    SimpleClass() {
        f.add(b1);
        f.add(b2);
        f.setLayout(new GridLayout(1, 2));
        f.setSize(200, 200);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

        b1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    new SubClass();
                } catch (IOException ex) {
                }
            }
        });
        b2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(astring);
            }
        });
    }

    public static void main(String[] args) {
        new SimpleClass();
    }
}

class BaseClass {
    String astring;

    public void setString(String astring) {
        this.astring = astring;
    }
}

class SubClass extends BaseClass {
    SubClass() throws FileNotFoundException {
        super.setString("WHYnull");
    }
}

在此代码中,有一个基类BaseClass和两个子类SimpleClassSubClass有两个按钮。当按下按钮“类别”时,则将字符串“ astring”设置为“ WHYnull”。现在我的问题是,当我在此之后按下“选择”按钮时,为什么要打印“空”变量“ astring”不是唯一的吗?

充满鳗鱼的气垫船

您声明:

当按下按钮“类别”时,则将字符串“ astring”设置为“ WHYnull”。

是的,这是正确的,但这仅适用于new SubClass()您在第一个ActionListoner中创建(并丢弃)的。它将对作为原始程序字段current的aString无效this

我的建议:这不是应该通过继承解决的问题。完全将继承留在这张照片之外。

我会做:

  b1.addActionListener(new ActionListener() {

     @Override
     public void actionPerformed(ActionEvent e) {
        // try {
        // new SubClass();
        // } catch (IOException ex) {
        //
        // }

        setString("Fubar");
     }
  });

还要注意,您的代码不应有空的catch块,因为Java相当于闭着眼睛开车。令人兴奋的是,但也很危险。


您询问使用多个类的GUI,一个常见的示例是Model-View-Control或MVC类型的程序设计,该程序的逻辑位于模型中,GUI在视图中,以及两者在控件中的交互。例如,以您的小程序为例,您可以执行以下操作:

import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class SimpleMCV {

   private static void createAndShowGui() {
      final SimpleView simpleView = new SimpleView();
      final SimpleModel simpleModel = new SimpleModel("");
      MainControl mainControl = new MainControl();
      mainControl.setUp(simpleView, simpleModel);

      JFrame frame = new JFrame("Simple GUI");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(simpleView);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class SimpleView extends JPanel {
   private JTextField textField = new JTextField(10);

   public SimpleView() {
      textField.setFocusable(false);
      add(textField);
   }

   public void setTextFieldText(String text) {
      textField.setText(text);
   }

   public void addAction(Action action) {
      add(new JButton(action));
   }
}

class MainControl {
   public void setUp(final SimpleView simpleView, final SimpleModel simpleModel) {
      simpleView.addAction(new SimpleControl(simpleModel, "Fubar"));
      simpleView.addAction(new SimpleControl(simpleModel, "Snafu"));
      simpleView.addAction(new SimpleControl(simpleModel, "Bohica"));

      simpleModel.addChangeListener(new ChangeListener() {

         @Override
         public void stateChanged(ChangeEvent e) {
            simpleView.setTextFieldText(simpleModel.getSomeText());
         }
      });
   }
}

@SuppressWarnings("serial")
class SimpleControl extends AbstractAction {
   private SimpleModel simpleModel;

   public SimpleControl(SimpleModel simpleModel, String name) {
      super(name);
      int mnemonic = (int) name.charAt(0);
      putValue(MNEMONIC_KEY, mnemonic);
      this.simpleModel = simpleModel;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      simpleModel.setSomeText(e.getActionCommand());
   }

}

class SimpleModel {
   private List<ChangeListener> listenerList = new ArrayList<>();
   private String someText;

   public SimpleModel(String someText) {
      this.someText = someText;
   }

   public String getSomeText() {
      return someText;
   }

   // change text and notify all listeners
   public void setSomeText(String someText) {
      this.someText = someText;
      for (ChangeListener changeListener : listenerList) {
         changeListener.stateChanged(new ChangeEvent(this));
      }
   }

   // allow outside classes to add a ChangeListener
   public void addChangeListener(ChangeListener cl) {
      listenerList.add(cl);
   }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在reactjs中点击按钮时html不打印?

为什么在反向打印时不打印?

为什么我的SIGPIPE不打印消息?

为什么我的程序不打印nextLine?

当我尝试反转字符串中的单词时,为什么我的代码不打印任何内容

为什么不打印精度?

为什么不打印“假”?

为什么不打印阵列?

为什么这个程序不打印:当我输入任何名字时,欢迎来到丛林消息?

为什么打印不打印我的数组排序

为什么代码总是打印True。每当我检查是否相等但不打印给定的字符串时总是打印布尔值

当我按下 iPhone 主页按钮、睡眠/电源按钮或终止我的应用程序,并再次重新运行它时,TestButtonAction 不打印

为什么python在time.sleep()之后不打印?

为什么在“.readlines()”之后“for line in f”不打印任何内容?

按钮不打印任何东西

为什么该程序不打印我提供的输入?(C)

为什么我的python脚本不打印任何内容

C ++为什么我的代码不打印对给定文件的更新

为什么我的JavaScript不打印到HTML?

为什么我的代码不打印任何内容?

为什么我的代码不打印排序后的数组?

为什么我的程序最后不打印任何内容?

为什么我的 R 函数不打印值?

为什么我的on_connect()不打印消息?

为什么我的代码不打印输出?

为什么我的程序不打印字符串?

为什么我的字符数组指针不打印?

为什么我的代码不打印产品链接?

标签以“ IMS”开头时,为什么Logcat不打印日志?