2011-12-29 9 views
1

JFrame frmによって作成されたJDialog dlgがJListリストを含んでいます。 ListModelを使用してリストを変更すると、リスト自体は再描画されますが、JDialogは再描画されません。 これは、行を削除するとリストに空白行が残っているのに対し、行を追加すると、dlgを手動で強制的に再描画するまで、この新しい行は表示されません(ダイアログにスペースがないため) (frmでダブルクリック)。JList変更後のJDialogペイント

この記事でアドバイスを以下に示します。 How to make repaint for JDialog in Swing?

と、この記事で: Force repaint after button click

私は、(リストの更新が行われた場所である)私のコントローラクラスから、呼び出すために次の行を試してみました:

SwingUtilities.getWindowAncestor(dlg).repaint(); 

しかし、機能しませんでした。 私も試してみました:どちらか

dlg.repaint(); 

運...

任意の手掛かり? ありがとうございます。

EDIT: クラスの構成は、次のとおりです。 メインJFrameへの参照を含むコントローラクラス、frm。 また、JDialogをMyDialogに拡張しました。これにはJListが含まれています。 frmのダブルクリックが検出されると、MyDialogのインスタンスを表示します(または初めて表示する場合は作成します)。また、JListはDefaultListModelに渡されるデータで埋められます。 MyDialogは、リストに必要な領域だけが描画されるように描画されます。 コントローラによって特定のイベントが検出されると、特定のMyDialogを取得し、JListからListModelを取得して更新します。ここでJListは実際に更新されますが、Dialogは同じままです。 私はこのようなコードを使用:

MyDialog dlg = group.getDlg(); 
if(dlg != null){ 
    DefaultListModel listModel = ((DefaultListModel) dlg.getMyJList().getModel()); 
    listModel.addElement(idStock); 
    SwingUtilities.getWindowAncestor(dlg).repaint(); 
} 

これはDLGを再描画しません。 私も試してみました:

SwingUtilities.getWindowAncestor(dlg.getMyJList()).repaint(); 

が、それは動作しません。

実際に行が実行されていることをデバッガで確認しました。

私は、私はあなたが間違った道を進んでいると思い.....本当に、

+0

あなたは正確に問題を描い短いサンプルコードを投稿することができますか? – thotheolh

+1

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

+0

前述の通り、いくつかのコードを投稿してください。 revalidate()も試してください。もちろん、デバッガを使ってrepaint/revalidateメソッドを呼び出すコードを入力するようにしてください。 – Raveline

答えて

5

を表示するためにはるかにコードを持っているすべてのJavaメソッドとクラスthroughtづけし、このModelはあなたのObjectsを保持しているだろうとDefaultListModelを定義していません、その後、例えば、JDialogまたはJOptionPaneJListを置く

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

// based on @trashgod code 
/** @see http://stackoverflow.com/questions/5759131 */ 
// http://stackoverflow.com/questions/8667719/jdialog-repaint-after-jlist-modification 

public class ListDialog { 

    private static final int N = 12; 
    private JDialog dlg = new JDialog(); 
    private DefaultListModel model = new DefaultListModel(); 
    private JList list = new JList(model); 
    private JScrollPane sp = new JScrollPane(list); 
    private int count; 

    public ListDialog() { 
     list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); 
     JPanel panel = new JPanel(); 
     panel.add(new JButton(new AbstractAction("Add") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       append(); 
       if (count <= N) { 
        list.setVisibleRowCount(count); 
        dlg.pack(); 
       } 
      } 
     })); 
     panel.add(new JButton(new AbstractAction("Remove") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       int itemNo = list.getSelectedIndex(); 
       if (itemNo > -1) { 
        removeActionPerformed(e, itemNo); 
       } 
      } 
     })); 
     for (int i = 0; i < N - 2; i++) { 
      this.append(); 
     } 
     list.setVisibleRowCount(N - 2); 
     dlg.add(sp, BorderLayout.CENTER); 
     dlg.add(panel, BorderLayout.SOUTH); 
     dlg.pack(); 
     dlg.setLocationRelativeTo(null); 
     dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     dlg.setVisible(true); 
    } 

    private void removeActionPerformed(ActionEvent e, int itemNo) { 
     System.out.println("made_list's model: " + list.getModel()); 
     System.out.println("Model from a fresh JList: " + new JList().getModel()); 
     model = (DefaultListModel) list.getModel(); 
     if (model.size() > 0) { 
      if (itemNo > -1) { 
       model.remove(itemNo); 
      } 
     } 
    } 

    private void append() { 
     model.addElement("String " + String.valueOf(++count)); 
     list.ensureIndexIsVisible(count - 1); 
    } 

    public static void main(String[] a_args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ListDialog pd = new ListDialog(); 
      } 
     }); 
    } 
} 
関連する問題