つまり、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. ウェブフォームに入力するのに最適なカレンダーポップアップは何ですか?
- 5. DataGridviewのコンボボックスでデータを入力して選択する方法
- 6. JTableセルに画像を挿入する方法
- 7. JTableの - セルエディタは、私は文字列値を編集するスタンダールセルエディタでスタンダールのJTableを使用しているテキスト
- 8. UITableViewCellをカスタマイズする最適な方法は何ですか?
- 9. アニメーションを駆動する最適な方法は何ですか?
- 10. 複数のデータ入力に最適なフォーマットは何でしょうか?
- 11. link_to_functionのリファクタリングに最適なUJSの方法は何ですか?
- 12. UISearchBarで入力すると最適な検索方法ですか?
- 13. ウェブサイトでストリームオーディオに最適な方法は何ですか
- 14. JTableでセルエディタとしてJComboBoxを使用して変更を保存する
- 15. mysqlにデータを保存するのに最適な方法は何ですか?
- 16. コンボボックスにテキストを入力する方法は?
- 17. vt.net、コンボボックスにテキストファイルを入力する方法は?
- 18. 入力の動的変更をトリガする方法は?
- 19. Asp.netの_DoPostBack javascriptメソッドの最適な方法は何ですか
- 20. JTableは最初のセルにその空
- 21. UITableViewの最適な保存方法は何ですか?
- 22. 画像をオーバーレイするのに最適な方法は何ですか?
- 23. TabNavigatorのタブを非表示にする最適な方法は何ですか?
- 24. LibreOfficeの表のセルに "="を入力する方法は?
- 25. Androidでキーストアパスワードを非表示にする最適な方法は何ですか?
- 26. Javaを使用してJTableで特定のセルをチェックする方法は?
- 27. JTableセルにタイムカウンタを表示する効率的な方法
- 28. テキスト入力などのユーザー入力に最適なソリューション
- 29. ユーザーが日付を入力する最も良い方法は何ですか
- 30. アンドロイドにデータを保存する最も適切な方法は何ですか?
私はコンボボックスセルエディタ上SwingX AutoCompleteDecoratorを使用しようとしています、と私は常にいくつかの点でフォーカスを失うので、私は... – DejanLekic
@DejanLekic問題を抱えている - ええ、デコレータがmuddyingさを水をさらに。あなたが達成する必要があるものを正確に説明している小規模なプログラムを用意してください。 SwingXのオートコンプリートマジックの現在のマスターです:-) – kleopatra
フィルタリングされたコンボボックス(http://snippets.dzone.com/posts)の実装をしようとしています。/show/7633)がセルエディタになります。 JTableのキーを押すと、そのキーをAutoCompleteComboに「転送」し、そのキーに一致する項目のリストを直ちにドロップする必要があります。 – DejanLekic