从JFrame修改独立的JPanels

从JFrame修改独立的JPanels,第1张

从JFrame修改独立的JPanels
  1. 使用MVC,Model-View-Control,关注点分离。
  2. 让拥有您的听众的控件更改模型的状态。
  3. 视图-您的GUI的控件添加了侦听器,以便将用户输入传输到控件,进而传输到模型。
  4. 视图还可以直接将侦听器添加到模型,以使他们可以在模型更改时更改其显示,或者通常通过控件间接完成此 *** 作。
  5. 不要将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);   }}

该示例缺少接口的使用,这将允许进一​​步分离关注点,从而导致松耦合(一件好事)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5427238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存