- 使用MVC,Model-View-Control,关注点分离。
- 让拥有您的听众的控件更改模型的状态。
- 视图-您的GUI的控件添加了侦听器,以便将用户输入传输到控件,进而传输到模型。
- 视图还可以直接将侦听器添加到模型,以使他们可以在模型更改时更改其显示,或者通常通过控件间接完成此 *** 作。
- 不要将MouseListeners添加到JButton中。使用ActionListeners就是因为它们的用途。例如,如果禁用JButton,则附加到它的任何ActionListener都将不起作用-这是正确的行为。对于MouseListeners,情况并非如此。
编辑
例如:
import java.awt.GridLayout;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import javax.swing.AbstractAction;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;import javax.swing.event.SwingPropertyChangeSupport;public class MvcMain { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { MvcView view = new MvcView(); MvcModel model = new MvcModel(); MvcControl control = new MvcControl(view, model); view.createAndDisplay(); } }); }}class MvcView { private MvcModel model; private ButtonPanel buttonPanel = new ButtonPanel(); private TextFieldPanel textFieldPanel = new TextFieldPanel(); private JPanel mainPanel = new JPanel(); public MvcModel getModel() { return model; } public ButtonPanel getButtonPanel() { return buttonPanel; } public TextFieldPanel getTextFieldPanel() { return textFieldPanel; } public MvcView() { mainPanel.setLayout(new GridLayout(0, 1)); mainPanel.add(textFieldPanel); mainPanel.add(buttonPanel); } public void setModel(MvcModel model) { this.model = model; model.addPropertyChangeListener(new ModelListener()); } public void createAndDisplay() { Jframe frame = new Jframe("MVC Test"); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); frame.add(mainPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } private class ModelListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent evt) { if (ButtonTitle.class.getCanonicalName().equals(evt.getPropertyName())) { ButtonTitle newValue = model.getButtonTitle(); textFieldPanel.textFieldSetText(newValue.getTitle()); } } }}enum ButtonTitle { START("Start"), STOP("Stop"), PAUSE("Pause"); private String title; private ButtonTitle(String title) { this.title = title; } public String getTitle() { return title; }}@SuppressWarnings("serial")class ButtonPanel extends JPanel { public ButtonPanel() { setBorder(BorderFactory.createTitledBorder("Button Panel")); setLayout(new GridLayout(1, 0, 5, 0)); for (ButtonTitle btnTitle : ButtonTitle.values()) { add(new JButton(new ButtonAction(btnTitle))); } } private class ButtonAction extends AbstractAction { private ButtonTitle btnTitle; public ButtonAction(ButtonTitle btnTitle) { super(btnTitle.getTitle()); this.btnTitle = btnTitle; } public void actionPerformed(java.awt.event.ActionEvent e) { Object oldValue = null; ButtonTitle newValue = btnTitle; ButtonPanel.this.firePropertyChange( ButtonTitle.class.getCanonicalName(), oldValue, newValue); }; }}@SuppressWarnings("serial")class TextFieldPanel extends JPanel { private JTextField textField = new JTextField(15); public TextFieldPanel() { setBorder(BorderFactory.createTitledBorder("TextField Panel")); add(textField); } public void textFieldSetText(String text) { textField.setText(text); }}class MvcControl { private MvcView view; private MvcModel model; public MvcControl(MvcView view, MvcModel model) { this.view = view; this.model = model; view.setModel(model); view.getButtonPanel().addPropertyChangeListener(new ButtonPanelListener()); } private class ButtonPanelListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent evt) { if (ButtonTitle.class.getCanonicalName().equals(evt.getPropertyName())) { ButtonTitle newValue = (ButtonTitle) evt.getNewValue(); model.setButtonTitle(newValue); } } }}class MvcModel { private ButtonTitle buttonTitle; private SwingPropertyChangeSupport pcSupport = new SwingPropertyChangeSupport( this); public void addPropertyChangeListener(PropertyChangeListener listener) { pcSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { pcSupport.removePropertyChangeListener(listener); } public ButtonTitle getButtonTitle() { return buttonTitle; } public void setButtonTitle(ButtonTitle buttonTitle) { ButtonTitle oldValue = this.buttonTitle; ButtonTitle newValue = buttonTitle; this.buttonTitle = buttonTitle; pcSupport.firePropertyChange(ButtonTitle.class.getCanonicalName(), oldValue, newValue); }}
该示例缺少接口的使用,这将允许进一步分离关注点,从而导致松耦合(一件好事)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)