つまり、JComboBox(または他のJComboBoxベースのセルエディタ)エディタが関連付けられているセルにユーザがタイプするたびに、JTableでコンボボックスをドロップダウンします。JTableセルに入力してコンボボックスのセルエディタをトリガする最適な方法は何ですか?
1
A
答えて
1
基本的に、コンボに適切なリスナーをインストールして、明示的にポップアップを開く必要があります。 「適切な」の最初の候補はAncestorListenerで、ancestorAddedメソッドのポップアップを表示します。
これは全体的な話ではないようです。表のsurrenderFocusプロパティがfalseの場合に機能します。 trueの場合、編集不可能なコンボだけが動作します。いくつかの掘り出した後、ancestorListenerによってポップアップが開かれた後、非動作部分の理由が内部focustransfer(コンボからテキストフィールドまで)であることが判明しました。その場合、エディタのeditingComponentがフォーカスを永久に得た後にポップアップを開く第2のリスナーが必要です。
複数のリスナーは、通常、互いの足に踏み込んでいるため、両方を永続的にインストールするのではなく、getEditorCompを呼び出すたびに行うのが最良です。以下は、それを行う方法の実際の例です。ちょうど注意してください:正式にはテストされていません!
public static class DefaultCellEditorX extends DefaultCellEditor {
private AncestorListener ancestorListener;
private PropertyChangeListener focusPropertyListener;
public DefaultCellEditorX(JComboBox comboBox) {
super(comboBox);
}
/**
* Overridden to install an appriate listener which opens the
* popup when actually starting an edit.
*
* @inherited <p>
*/
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
super.getTableCellEditorComponent(table, value, isSelected, row, column);
installListener(table);
return getComponent();
}
/**
* Shows popup.
*/
protected void showPopup() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
getComponent().setPopupVisible(true);
}
});
}
/**
* Dynamically install self-uninstalling listener, depending on JComboBox
* and JTable state.
* @param table
*/
private void installListener(JTable table) {
if (getComponent().isEditable() && table.getSurrendersFocusOnKeystroke()) {
installKeyboardFocusListener();
} else {
installAncestorListener();
}
}
private void installAncestorListener() {
if (ancestorListener == null) {
ancestorListener = new AncestorListener() {
@Override
public void ancestorAdded(AncestorEvent event) {
getComponent().removeAncestorListener(ancestorListener);
showPopup();
}
@Override
public void ancestorRemoved(AncestorEvent event) {
}
@Override
public void ancestorMoved(AncestorEvent event) {
}
};
}
getComponent().addAncestorListener(ancestorListener);
}
private void installKeyboardFocusListener() {
if (focusPropertyListener == null) {
focusPropertyListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
LOG.info("property: " + evt.getPropertyName());
if (focusManager().getPermanentFocusOwner() !=
getComponent().getEditor().getEditorComponent()) return;
focusManager()
.removePropertyChangeListener("permanentFocusOwner", focusPropertyListener);
showPopup();
}
};
}
focusManager().addPropertyChangeListener("permanentFocusOwner", focusPropertyListener);
}
/**
* Convience for less typing.
* @return
*/
protected KeyboardFocusManager focusManager() {
return KeyboardFocusManager.getCurrentKeyboardFocusManager();
}
/**
* Convenience for type cast.
* @inherited <p>
*/
@Override
public JComboBox getComponent() {
return (JComboBox) super.getComponent();
}
}
0
JTable table = new JTable(data, columns);
table.putClientProperty("terminateEditOnFocusLost", true);
JScrollPane scrollPane = new JScrollPane(table);
final JXComboBox editorComboBox = new JXComboBox(array);
editorComboBox.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent event) {
//make sure combobox handles key events
editorComboBox.requestFocusInWindow();
}
public void ancestorMoved(AncestorEvent event) {}
public void ancestorRemoved(AncestorEvent event) {}
});
AutoCompleteDecorator.decorate(editorComboBox);
TableColumn column = table.getColumnModel().getColumn(0);
column.setCellEditor(new ComboBoxCellEditor(editorComboBox));
関連する問題
- 1. jtableのコラムからコンボボックスを入力してください
- 2. tesseractに最適な画像入力タイプは何ですか?
- 3. PyGTKで時間を入力するのに最適なウィジェットは何ですか
- 4. 範囲入力でjqueryをトリガする最善の方法
- 5. 入力からdatetime-local値を取得してデータベースに挿入する適切な方法は何ですか?
- 6. ウェブフォームに入力するのに最適なカレンダーポップアップは何ですか?
- 7. ライブウェブサイトのサムネイルを最適化する最適な方法は何ですか?
- 8. Golang:連想スライスを入力する最適な方法は?
- 9. DataGridviewのコンボボックスでデータを入力して選択する方法
- 10. 入力タグを使用する適切な方法は何ですか?
- 11. 入力なしでイベントをトリガする方法
- 12. MVCでイベントをトリガする最適な場所は何ですか?
- 13. JTableの - セルエディタは、私は文字列値を編集するスタンダールセルエディタでスタンダールのJTableを使用しているテキスト
- 14. UITableViewCellをカスタマイズする最適な方法は何ですか?
- 15. シングルトンを作成する最適な方法は何ですか?
- 16. アニメーションを駆動する最適な方法は何ですか?
- 17. link_to_functionのリファクタリングに最適なUJSの方法は何ですか?
- 18. JTableセルに画像を挿入する方法
- 19. グラフを入力しようとしていますが、探索されたノードを格納するのに最も最適な方法は何ですか?
- 20. 複数のデータフレームに最適な方法は何ですか?
- 21. 複数のデータ入力に最適なフォーマットは何でしょうか?
- 22. ウェブサイトでストリームオーディオに最適な方法は何ですか
- 23. ストアドプロシージャを使用して整数を挿入または更新する最適な方法は何ですか?
- 24. JTableセルエディタ間引きしきい値
- 25. JTableでセルエディタとしてJComboBoxを使用して変更を保存する
- 26. UISearchBarで入力すると最適な検索方法ですか?
- 27. 遅延ロードに最適な方法は何ですか?
- 28. ウェブアドレッシングに最適な方法は何ですか
- 29. mysqlにデータを保存するのに最適な方法は何ですか?
- 30. Asp.netの_DoPostBack javascriptメソッドの最適な方法は何ですか
私はコンボボックスセルエディタ上SwingX AutoCompleteDecoratorを使用しようとしています、と私は常にいくつかの点でフォーカスを失うので、私は... – DejanLekic
@DejanLekic問題を抱えている - ええ、デコレータがmuddyingさを水をさらに。あなたが達成する必要があるものを正確に説明している小規模なプログラムを用意してください。 SwingXのオートコンプリートマジックの現在のマスターです:-) – kleopatra
フィルタリングされたコンボボックス(http://snippets.dzone.com/posts)の実装をしようとしています。/show/7633)がセルエディタになります。 JTableのキーを押すと、そのキーをAutoCompleteComboに「転送」し、そのキーに一致する項目のリストを直ちにドロップする必要があります。 – DejanLekic