Я бы бросить в некоторых MVC это намного больше работы, но это делает для более гибкого кодирования ,
Сначала ModelBean
с boolean checked
и propertyChangeSupport
для стрельбы события изменения свойства
import java.beans.*;
import java.io.Serializable;
public class ModelBean implements Serializable {
private boolean checked;
private PropertyChangeSupport propertySupport;
public ModelBean() {
propertySupport = new PropertyChangeSupport(this);
}
public boolean getChecked() {
return checked;
}
public void setChecked(boolean checked) {
boolean oldValue = this.checked;
this.checked = checked;
propertySupport.firePropertyChange("checked", oldValue, this.checked);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
}
Тогда у вас есть свой главный GUI
класса, который принимает ModelBean
в качестве аргумента
class GUI extends JFrame {
private ModelBean model;
private JCheckBox cbox;
public GUI(ModelBean model) {
this.model = model;
cbox = new JCheckBox("Check and watch me print");
cbox.addItemListener(new CheckListener(model));
setLayout(new GridBagLayout());
add(cbox);
setSize(300, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
И вы ItemListener
класса принимает тот же ModelBean
в качестве аргумента, а также добавляет PropertyChangeListener
к model
class CheckListener implements ItemListener {
private ModelBean model;
public CheckListener(ModelBean newModel) {
this.model = newModel;
model.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
System.out.println(model.getChecked());
}
});
}
@Override
public void itemStateChanged(ItemEvent e) {
JCheckBox source = (JCheckBox) e.getSource();
if (source.isSelected()) {
model.setChecked(true);
} else {
model.setChecked(false);
}
}
}
Затем класс запустить программу
public class TestMVC {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final ModelBean model = new ModelBean();
GUI gui = new GUI(model);
}
});
}
}
Похоже, много работы только за глупый boolean
но концепция лучше общий дизайн для больших программ, где много разных данных нужно манипулировать и прослушивать изменения.
UPDATE
Другой вариант, если ваш GUI является родительским контейнером, и вы не хотите, чтобы выставить его, передавая его по ссылке, вы можете создать interface
и иметь GUI
реализовать
public interface BooleanInterface {
public void setBoolean(boolean bool);
}
public class GUI extends JFrame implements BooleanInterface {
boolean bool;
@Override
public void setBoolean(boolean bool) {
this.bool = bool;
}
}
public BoxListener implements ActionListener {
BooleanInterface boolFace;
public BoxListener(BooleanInterface boolFace) {
this.boolFace = boolFace;
}
}
Вы можете затем передать GUI
к слушателю. Хотя он выглядит так же, как то, что вы уже делаете, на самом деле не, так как он больше не предоставляет GUI
, а использует интерфейс.
Существует множество примеров того, как это сделать. Попробуйте и google это! – ohlmar
Зачем вам нужно передать 'A' в качестве параметра? Я не понимаю, что вы пытаетесь сделать. –
Потому что actionlistener на коробке ничего не знает о GUI. – Gobliins