我正在学习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类调用它。
我只是想知道我在这种情况下的做法是否合适?或任何其他整齐的方式来分离听众类?
非常感谢
答案 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相关。
希望这有帮助..