2012-03-18 9 views
2

最初のものは - earlierという質問を投稿しました。なぜ私のコードが機能しなかったのか、この質問私はその質問のアドバイスに基づいて行動しています。
Java Swing - カスタムデータオブジェクトの変更に基づいて自分自身を再描画するUiを書く

私の使用例はこれです。このことの結果変数の入力変数名の

  1. 一覧
  2. 文字列(名前 -

    イムは、すべてのMethodが2つのデータメンバを持つカスタムデータオブジェクトによって表される、請求MethodEditorモジュールを書きますメソッドセット)。

これらのオブジェクトは、JDialogのデータを入力した結果として生成されます。
これらのオブジェクトは、List<Method> である1つのデータメンバを持つコンテナに格納されます。コンテナは、コントローラJPanelから上記JDialogが呼び出された場所にあります。

UIの観点からは、MethodのオブジェクトをすべてクリックしてクリックするとJbuttonの形式で表示され、JDialogが開き、ユーザーが編集できるようにします。

リストにMethodEditor作用しJButtonが、List<Method>Method 1の垂直配列を生成しました。このList<Method>は、前述のコントローラJPaneからMethodEditorに渡されます。

私はList<Method>PropertyChangeListenerを追加すると毎回自体をrepaintPropertyChangeイベントがあったがうまくいきませんでした私のアプローチは、再描画が起こりませんでしょうJPanelとしてMethodEditorを実装question私の以前に持っていました。

私のユースケースを実装する別の方法はありますか、以前のquestionに掲載された自分のコードに対して行うことができる修正がありますか?

+0

してくださいあなたの最後の3つの質問は約1です)JComponentの、またはモデルについて、2)問題とモデルからJComponentの通知、3)あなたの現在の状況は、モデル要素の別の番号が含まれていることですGUIとの比較で – mKorbel

答えて

3

あなたの問題は解決策があるように以前に言及されています。実際には、PropertyChangeListener内からコンポーネントをオブザーバーパネルに追加または削除する必要があります。 revalidate()repaint()を呼び出すと、と呼ばれる前に明示的にを実行しない限り、魔法のようにコンポーネントが追加または削除されることはありません。例えば

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.beans.IndexedPropertyChangeEvent; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import javax.swing.*; 
import javax.swing.event.SwingPropertyChangeSupport; 

public class ListenToTest { 
    public static final String[] ITEMS = {"Sunday", "Monday", "Tuesday", "Wednesday", 
     "Thursday", "Friday", "Saturday"}; 
    private JPanel mainPanel = new JPanel(); 
    private ObserverPanel observerPanel = new ObserverPanel(); 
    private ListenToModel model = new ListenToModel(); 

    public ListenToTest() { 
     observerPanel.setModel(model); 

     for (String item : ITEMS) { 
     model.addItem(item); 
     } 

     JPanel btnPanel = new JPanel(); 
     btnPanel.add(new JButton(new AddAction("Add"))); 
     btnPanel.add(new JButton(new RemoveAction("Remove"))); 

     mainPanel.setLayout(new BorderLayout()); 
     mainPanel.add(new JScrollPane(observerPanel.getMainComponent())); 
     mainPanel.add(btnPanel, BorderLayout.PAGE_END); 
    } 

    public JComponent getMainComponent() { 
     return mainPanel; 
    } 

    private class AddAction extends AbstractAction { 
     public AddAction(String title) { 
     super(title); 
     } 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
     String text = JOptionPane.showInputDialog(mainPanel, "Enter a String"); 
     if (text != null) { 
      model.addItem(text); 
     } 
     } 
    } 

    private class RemoveAction extends AbstractAction { 
     public RemoveAction(String title) { 
     super(title); 
     } 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
     int index = observerPanel.getSelectedIndex(); 
     if (index >= 0) { 
      model.removeItem(index); 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     ListenToTest mainPanel = new ListenToTest(); 

     JFrame frame = new JFrame("ListenToModelTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel.getMainComponent()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class ObserverPanel { 
    public static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 18); 
    protected static final Color SELECTED_COLOR = new Color(150, 150, 255); 
    private JPanel mainPanel = new JPanel(); 
    private ListenToModel model; 
    private GridLayout gridLayout = new GridLayout(0, 1); 
    private int selectedIndex = -1; 

    public ObserverPanel() { 
     mainPanel.setLayout(gridLayout); 
     mainPanel.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      Point p = e.getPoint(); 
      Component[] components = mainPanel.getComponents(); 
      for (int i = 0; i < components.length; i++) { 
       if (mainPanel.getComponentAt(p).equals(components[i])) { 
        selectedIndex = i; 
        components[i].setBackground(SELECTED_COLOR); 
       } else { 
        components[i].setBackground(null); 
       } 
      } 
     } 
     }); 
    } 

    public int getSelectedIndex() { 
     return selectedIndex; 
    } 

    public void setModel(ListenToModel model) { 
     this.model = model; 
     model.addPropertyChangeListener(new ObserverPanelListener()); 
    } 

    public JComponent getMainComponent() { 
     return mainPanel; 
    } 

    private class ObserverPanelListener implements PropertyChangeListener { 
     public void propertyChange(PropertyChangeEvent evt) { 
     if (evt.getPropertyName().equals(ListenToModel.ADD)) { 
      JLabel label = createLabel(evt); 
      for (Component comp : mainPanel.getComponents()) { 
       comp.setBackground(null); 
      } 
      int index = ((IndexedPropertyChangeEvent)evt).getIndex(); 
      mainPanel.add(label, index); 
      label.setBackground(SELECTED_COLOR); 
      selectedIndex = index; 
     } else if (evt.getPropertyName().equals(ListenToModel.REMOVE)) { 
      int index = ((IndexedPropertyChangeEvent)evt).getIndex(); 
      mainPanel.remove(index); 
      for (Component comp : mainPanel.getComponents()) { 
       comp.setBackground(null); 
      } 
      selectedIndex = -1; 
     } else if (evt.getPropertyName().equals(ListenToModel.REMOVE_ALL)) { 
      mainPanel.removeAll(); 
      selectedIndex = -1; 
     } 
     mainPanel.revalidate(); 
     mainPanel.repaint(); 
     } 

     private JLabel createLabel(PropertyChangeEvent evt) { 
     String newValue = evt.getNewValue().toString(); 
     JLabel label = new JLabel(newValue); 
     label.setFont(LABEL_FONT); 
     int eb = 20; 
     label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.blue), 
       BorderFactory.createEmptyBorder(eb , eb, eb, eb))); 
     label.setFocusable(true); 
     label.setOpaque(true); 
     return label; 
     } 
    } 
} 

class ListenToModel implements Iterable<String> { 
    public static final String ADD = "add"; 
    public static final String REMOVE = "remove"; 
    public static final String REMOVE_ALL = "remove all"; 
    private SwingPropertyChangeSupport spcSupport = new SwingPropertyChangeSupport(
     this); 
    private List<String> modelNucleus = new ArrayList<String>(); 

    public void addItem(String item) { 
     modelNucleus.add(item); 
     spcSupport.fireIndexedPropertyChange(ADD, modelNucleus.size() - 1, null, 
      item); 
    } 

    public void addItem(int index, String item) { 
     if (index < 0 || index > modelNucleus.size()) { 
     // TODO: throw an exception 
     } else { 
     modelNucleus.add(index, item); 
     spcSupport.fireIndexedPropertyChange(REMOVE, index, null, item); 
     } 

    } 

    public void removeItem(int index) { 
     if (index < 0 || index >= modelNucleus.size()) { 
     // TODO: throw an exception 
     } else { 
     String oldValue = modelNucleus.remove(index); 
     spcSupport.fireIndexedPropertyChange(REMOVE, index, oldValue, null); 
     } 
    } 

    public void removeAll() { 
     modelNucleus.clear(); 
     spcSupport.firePropertyChange(REMOVE_ALL, null, null); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     spcSupport.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     spcSupport.removePropertyChangeListener(listener); 
    } 

    @Override 
    public Iterator<String> iterator() { 
     return modelNucleus.iterator(); 
    } 
} 
+0

あなたは、私のヒーローです!魅力のように働いた。既に尋ねられたことを聞いてくれてありがとうと謝罪します。 – ping

+0

@ping:これはAKJの以前の質問で解決されました。あなたは彼の答えを受け入れることを検討すべきです。 –

+1

完了!私の前の質問で彼の答えを受け入れた。 – ping

3

私は(あなたの最後の3つの質問から)本当に迷ってしまいました、

をすることができ、我々はあなたが3本の場合には、1つのGUIのためModelsを離れてしまっていることを想像しますが、変更する場合は重要ではないんGUIの要素数、または1 JComponentのプロパティを変更、

PropertyChangeListenerからの出力はかなり出力が確認してくださいEDT

import java.awt.BorderLayout; 
import java.awt.event.*; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeSupport; 
import java.util.LinkedList; 
import java.util.Queue; 
import javax.swing.*; 

public class MVC_ProgressBarThread { 

    private MVC_ProgressBarThread() { 
     MVC_View view = new MVC_View(); 
     MVC_Model model = new MVC_Model(); 
     MVC_Control control = new MVC_Control(view, model); 
     view.setControl(control); 
     JFrame frame = new JFrame("MVC_ProgressBarThread"); 
     frame.getContentPane().add(view); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MVC_ProgressBarThread mVC_ProgressBarThread = new MVC_ProgressBarThread(); 
      } 
     }); 
    } 
} 

class MVC_View extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private MVC_Control control; 
    private JProgressBar progressBar = new JProgressBar(); 
    private JButton startActionButton = new JButton("Press Me and Run this Madness"); 
    private JLabel myLabel = new JLabel("Nothing Special"); 

    public MVC_View() { 
     startActionButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       buttonActionPerformed(); 
      } 
     }); 
     JPanel buttonPanel = new JPanel(); 
     startActionButton.setFocusPainted(false); 
     buttonPanel.add(startActionButton); 
     setLayout(new BorderLayout(10, 10)); 
     add(buttonPanel, BorderLayout.NORTH); 
     progressBar.setStringPainted(true); 
     add(progressBar, BorderLayout.CENTER); 
     myLabel.setIcon(UIManager.getIcon("OptionPane.questionIcon")); 
     myLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     add(myLabel, BorderLayout.SOUTH); 
    } 

    public void setControl(MVC_Control control) { 
     this.control = control; 
    } 

    private void buttonActionPerformed() { 
     if (control != null) { 
      control.doButtonAction(); 
     } 
    } 

    public void setProgress(int progress) { 
     progressBar.setValue(progress); 
    } 

    public void setProgressLabel(String label) { 
     progressBar.setString(label); 
    } 

    public void setIconLabel(Icon icon) { 
     myLabel.setIcon(icon); 
    } 

    public void start() { 
     startActionButton.setEnabled(false); 
    } 

    public void done() { 
     startActionButton.setEnabled(true); 
     setProgress(100); 
     setProgressLabel(" Done !!! "); 
     setIconLabel(null); 
    } 
} 

class MVC_Control { 

    private MVC_View view; 
    private MVC_Model model; 

    public MVC_Control(final MVC_View view, final MVC_Model model) { 
     this.view = view; 
     this.model = model; 
     model.addPropertyChangeListener(new PropertyChangeListener() { 

      @Override 
      public void propertyChange(PropertyChangeEvent pce) { 
       if (MVC_Model.PROGRESS.equals(pce.getPropertyName())) { 
        view.setProgress((Integer) pce.getNewValue()); 
       } 
       if (MVC_Model.PROGRESS1.equals(pce.getPropertyName())) { 
        view.setProgressLabel((String) pce.getNewValue()); 
       } 
       if (MVC_Model.PROGRESS2.equals(pce.getPropertyName())) { 
        view.setIconLabel((Icon) pce.getNewValue()); 
       } 
      } 
     }); 
    } 

    public void doButtonAction() { 
     view.start(); 
     SwingWorker<Void, Void> swingworker = new SwingWorker<Void, Void>() { 

      @Override 
      protected Void doInBackground() throws Exception { 
       model.reset(); 
       model.startSearch(); 
       return null; 
      } 

      @Override 
      protected void done() { 
       view.done(); 
      } 
     }; 
     swingworker.execute(); 
    } 
} 

class MVC_Model { 

    public static final String PROGRESS = "progress"; 
    public static final String PROGRESS1 = "progress1"; 
    public static final String PROGRESS2 = "progress2"; 
    private static final int MAX = 11; 
    private static final long SLEEP_DELAY = 1000; 
    private int progress = 0; 
    private String label = "Start"; 
    private PropertyChangeSupport pcs = new PropertyChangeSupport(this); 
    private PropertyChangeSupport pcs1 = new PropertyChangeSupport(this); 
    private PropertyChangeSupport pcs2 = new PropertyChangeSupport(this); 
    private final String[] petStrings = {"Bird", "Cat", "Dog", 
     "Rabbit", "Pig", "Fish", "Horse", "Cow", "Bee", "Skunk"}; 
    private int index = 1; 
    private Queue<Icon> iconQueue = new LinkedList<Icon>(); 
    private Icon icon = (UIManager.getIcon("OptionPane.questionIcon")); 

    public void setProgress(int progress) { 
     int oldProgress = this.progress; 
     this.progress = progress; 
     PropertyChangeEvent evt = new PropertyChangeEvent(this, PROGRESS, 
       oldProgress, progress); 
     pcs.firePropertyChange(evt); 
    } 

    public void setProgressLabel(String label) { 
     String oldString = this.label; 
     this.label = label; 
     PropertyChangeEvent evt = new PropertyChangeEvent(this, PROGRESS1, 
       oldString, label); 
     pcs1.firePropertyChange(evt); 
    } 

    public void setIconLabel(Icon icon) { 
     Icon oldIcon = this.icon; 
     this.icon = icon; 
     PropertyChangeEvent evt = new PropertyChangeEvent(this, PROGRESS2, 
       oldIcon, icon); 
     pcs2.firePropertyChange(evt); 
    } 

    public void reset() { 
     setProgress(0); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     pcs.addPropertyChangeListener(listener); 
     pcs1.addPropertyChangeListener(listener); 
     pcs2.addPropertyChangeListener(listener); 
    } 

    public void startSearch() { 
     iconQueue.add(UIManager.getIcon("OptionPane.errorIcon")); 
     iconQueue.add(UIManager.getIcon("OptionPane.informationIcon")); 
     iconQueue.add(UIManager.getIcon("OptionPane.warningIcon")); 
     iconQueue.add(UIManager.getIcon("OptionPane.questionIcon")); 
     for (int i = 0; i < MAX; i++) { 
      int newValue = (100 * i)/MAX; 
      setProgress(newValue); 
      setProgressLabel(petStrings[index]); 
      index = (index + 1) % petStrings.length; 
      setIconLabel(nextIcon()); 
      try { 
       Thread.sleep(SLEEP_DELAY); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

    private Icon nextIcon() { 
     Icon icon1 = iconQueue.peek(); 
     iconQueue.add(iconQueue.remove()); 
     return icon1; 
    } 
} 
0

上で行うことができることを保証しますPropertyChangeEventが起動しないことを示します。それは火を行いますが、再描画が起こらない場合、それは少し、このように再描画を延期するために役立つかもしれない:

は変更イベントが
//change this 
button.repaint(); 

// to this 
SwingUtilties.invokeLater(new Runnable() { public void run() { button.repaint(); }}); 

発火しない場合 - 無視し、すべての後に「してください」;)

関連する問題