1

私は次のことを達成しようとしていました。

データに数値を使用する JSpinner を使用したいのですが、「6 / 10」、つまり「値 / 最大」のようにレンダリングしたいのですが、デフォルトの JSpinner は「値」のみを表示します。もちろん、私は SpinnerNumberModel を使用して、整数をデータとして扱うだけです。

JCombobox レンダラーおよび/またはエディター、JTable レンダラーおよび/またはエディターと比較してアナログ動作を探していましたが、JSpinner はこのようには機能しないようです。スピナー内のカスタムコンテンツ用に、この例を見つけました。例では JLabel を使用してアイコンを表示していますが、私の場合は、 を押した後に内容を編集して入力を確認できるようにする必要がありますEnter

だから、これは私が基本的にやったことです:

JSpinner spinner = new JSpinner(new SpinnerNumberModel(1,1,10,1));
spinner.setEditor(new CustomSpinnerEditor(spinner));

ここで、CustomSpinnerEditor は JTextField を拡張しています。その上でいくつかのinputmap / actionmapのものを解き放ち(Enter動作のために)、スピナーにChangeListenerを追加して、ユーザーが矢印をクリックしたときにテキストフィールドのコンテンツを更新できるようにし、FocusListenerを追加してfocusGainedのすべてのテキストを選択し、入力を確認しましたfocusLost、...そしてそれは機能します。

したがって、問題はそれを機能させないことです。問題は、これは非常に単純な作業に対してあまりにも多くの作業を行うことであり、デフォルトのエディターを使用しないことで一部の機能が失われる可能性があることです。コンポーネントがレンダラーを設定する機能を提供するだけであれば、JComboBox で行うように、正しい文字列で JLabel を返すだけのフックがあったはずです。

私が望むものを達成するためのより簡単な方法はありますか?

4

3 に答える 3

3

専用エディターの作成を避けることはできますが、それが簡単になるかどうかはわかりません: を使用してデフォルトのエディターのテキスト フィールドを取得します

JFormattedTextField f = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();

次に、そのテキスト フィールドにフォーマッタ ファクトリを設定します。

f.setFormatterFactory(new AbstractFormatterFactory() {
    @Override
    public AbstractFormatter getFormatter(JFormattedTextField tf) {
        // return your formatter
    }
});

メソッドによって返されたフォーマッタは、そのメソッドとメソッドgetFormatterを使用して、値とその文字列表現の間で変換する必要があります。stringToValuevalueToString

于 2013-05-29T16:41:42.277 に答える