2016-08-23 14 views
0

データベースの値によってデータが取り込まれるJComboBoxがあります。値は常にチェックされ、コンボボックスのリストが更新されます。値は通常は同じままですが、削除または追加されることもあります。モデルを設定するときのJava JComboBoxのリセット選択

public static void updateList(List curList, List items, JComboBox box, 
     boolean addEmptyItem) { 

    curList.clear(); 
    curList.addAll(items); 

    ActionListener[] listeners = box.getActionListeners(); 
    for (ActionListener al : listeners) { 
     box.removeActionListener(al); 
    } 

    Object selected = box.getSelectedItem(); 

    box.removeAllItems(); 
    if (addEmptyItem) { 
     box.addItem(""); 
    } 
    for (Object t : curList) { 
     box.addItem(t); 
    } 

    if (selected != null) { 
     box.setSelectedItem(selected); 
    } else { 
     if (box.getItemCount() > 0) { 
      box.setSelectedIndex(0);  
     } // end if  
    } 

    if (listeners != null) { 
     for (ActionListener al : listeners) { 
      box.addActionListener(al); 
     } 
    } 
} 

ウィンドウがcurListを追跡し、itemsが新しいリストです:私は変更はこれが方法です消えてから、選択リストのポップアップを防ぐために行われていたことをリスナーに通知することなく、リストを更新する方法があります。

選択したアイテムは、すべてのアップデートでポップアップが表示される前の状態にリセットされます(これは問題ありません。選択したアイテムは同じままでなければなりません)。しかし、これはユーザーがホバリングしているものに影響しています。これは、ユーザーがスクロールして選択したアイテムがリストの最初のものだった場合、ポップアップが自動的にスクロールバーをスクロールバーに表示したときに顕著に表示されます。マウスのホバーが上に移動しているという事実は本当の問題です。

ホバーが選択されているアイテムに変更されないようにする方法はありますか?

+1

JComboBoxのItemListenerを動的に削除/追加することを検討してください。 – copeg

+0

@copeg ActionListenersが削除された方法を説明したように、ItemListenersを削除/追加しました。これは私が見ていた問題を解決しました。ありがとう! – Trim

答えて

2

ユーザーが

Object child = comboBox.getAccessibleContext().getAccessibleChild(0); 
    BasicComboPopup popup = (BasicComboPopup)child; 
    JList list = (JList)popup.getList(); 
    Container c = SwingUtilities.getAncestorOfClass(JScrollPane.class, list); 
    JScrollPane scrollPane = (JScrollPane)c; 

を下にスクロールした場合、上記のコードは、コンボボックスのポップアップで使用されているスクロールペインにアクセスすることができますので、ポップアップはスクロールバーが含まれている場合、これは特に顕著です。

だから、ビューポートの位置を保存してから処理した後、それを復元することができます:上記は動作しません

Point p = scrollPane.getViewport().getViewPosition(); 
// do your processing to update the combo box model 
scrollPane.getViewport().setViewPosition(p); 

注場合は、SwingUtilities.invokeLater(....)setViewPosition()声明をラップしてみてください。

関連する問題