Java如何从子类调用方法

时间:2014-07-01 01:28:39

标签: java swing jbutton actionlistener

我正在学习Swing在java中制作GUI。我的目标是让一个mainGUI类初始化所有内容,另一个类控制所有按钮。

我现在正在做的是我有一个mainGUI,它有:

public class mainGUI(){
.... (main and initialize things here) ....

protected JButton btnLogin;
public void initialize(){
    btnLogin = new JButton("Login");
    btnLogin.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            _buttonLogin();
        }
    });
}

protected void _buttonLogin(){};
}

然后在我的buttonControl中我有:

public class buttonControl extends mainGUI{
@Override
protected void _buttonLogin(){
    if (isLogin == true){
        btnLogin.setEnabled(false); 
    } else {
        // somthing else
    }
}
}

该计划实际上有效但不像我预期的那样。当我点击"登录"按钮,登录按钮未设置为不可点击。如果我没有在mainGUI类中使用_buttonLogin方法,那么我就无法从buttonControl类调用它。

我只是想知道我在这种情况下的做法是否合适?或任何其他整齐的方式来分离听众类?

非常感谢

3 个答案:

答案 0 :(得分:4)

对于一个你滥用继承的人。您不能使用继承来访问变量。为此,你应该使用组合。

例如,ButtonControl(并注意任何类的第一个字母应以大写字母开头),可以有一个MainGui字段,通过其构造函数传递给它。然后控件类可以调用Gui方法。

class ButtonControl extends AbstractAction {
   MainGui gui;

   public ButtonControl(MainGui gui, String name, int mnemonic) {
      super(name);
      putValue(MNEMONIC, mnemmonic);
      this.gui = gui;
   }

   public void actionPerformed(ActionEvent e) {
       // ....
   }
}

它可以像这样使用:

ButtonControl btnCtrl = new ButtonControl(this, "My Button", KeyEvent.VK_M);
JButton myButton = new JButton(btnCtrl);

答案 1 :(得分:3)

如果你需要一个Single类来控制你拥有的所有按钮,你可以创建一个ButtonControl类,它可以注册和取消注册按钮并在控件类中处理它的事件。给出了一个简单的示例代码

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;


public class MainUI extends JFrame{

ButtonController buttonController;

public MainUI() {
    super();
    buttonController=new ButtonController(this);
    initialize();
}

private void initialize() {

    JTextField userName=new JTextField();
    JPasswordField passwordField=new JPasswordField();

    JButton loginButton=new JButton("Login");
    loginButton.setActionCommand(ButtonController.LOGIN_COMMAND);

    JButton cancelButton=new JButton("Cancel");
    cancelButton.setActionCommand(ButtonController.CANCEL_COMMAND);

    JPanel contentPane=new JPanel();
    contentPane.setLayout(new GridLayout(3,2));
    contentPane.add(new JLabel("Username : "));
    contentPane.add(userName);
    contentPane.add(new JLabel("Password : "));
    contentPane.add(passwordField);
    contentPane.add(loginButton);
    contentPane.add(cancelButton);

    buttonController.registerButton(loginButton);
    buttonController.registerButton(cancelButton);

    setContentPane(contentPane);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    pack();
}


/**
 * @param args
 */
public static void main(String[] args) {
    MainUI ui=new MainUI();
    ui.setVisible(true);
}


}


class ButtonController implements ActionListener
{
private MainUI mainUI;

public static String LOGIN_COMMAND="Login";
public static String CANCEL_COMMAND="Cancel";

public ButtonController(MainUI mainUi ) {
    this.mainUI=mainUi;
}

public void registerButton(JButton button)
{
    button.addActionListener(this);
}

public void deRegisterButton(Button button)
{
    button.removeActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getActionCommand().equals(LOGIN_COMMAND))
    {
        ((JButton)e.getSource()).setEnabled(false);
    }
    if(e.getActionCommand().equals(CANCEL_COMMAND))
    {
        mainUI.dispose();
    }
}

}

答案 2 :(得分:0)

我使用swing已经很久了,但我们只能通过子类对象类型来调用子类实现:

mainGUI gui = new buttonControl();
如果我们想让调用者使用buttonControl中的实现,我们应该传递buttonControl对象类型实例而不是mainGui实例。

这与Polymorphism with overidding相关。

希望这有帮助..