【问题标题】:When I click select button after category button, why isn't the String being printed and null being printed instead?当我单击类别按钮后的选择按钮时,为什么不打印字符串而打印空值?
【发布时间】:2015-05-30 14:26:17
【问题描述】:
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。有两个按钮。当按钮 "Category" 被按下时,字符串 "astring" 被设置为 "WHYnull"。现在我的问题是,当我按下 "Select" 按钮之后,为什么会打印 "null" ?变量 "astring" 不是排他的吗?

【问题讨论】:

    标签: java class user-interface hierarchy


    【解决方案1】:

    你说:

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

    是的,这是正确的,但仅适用于您在第一个 ActionListoner 中创建(并丢弃)的 new SubClass()。它不会影响作为原始程序字段的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);
       }
    }
    

    【讨论】:

    • @User: "You mean in gui one can not deal with many classes?" 什么?不,一点也不真实。我的大部分 GUI 都使用许多类,而您的问题与 GUI 完全无关。相反,您正在使用继承来解决纯粹而简单的继承无法解决的问题。
    • 能给个例子或者链接吗?
    • @User:举个例子?
    • 一个使用 1 个 gui 类 @Hovercraft 的不同类的示例
    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2013-09-17
    相关资源
    最近更新 更多