1

すべてのJComponentで機能するように作成されたカスタムJTable(15行x 20列)があります。現在、JComboBoxes、JTextFields、およびJButtonsの混合に使用しています。ああ、私はJava5を使用しています(要件)。

2つの質問があります:

1)1つ目は、TableCellRendererクラスとその単一のメソッドに関するものです。

public Component getTableCellRendererComponent(final JTable table,
                                                   final Object value,
                                                   final boolean isSelected,
                                                   final boolean hasFocus,
                                                   final int row,
                                                   final int column) {...}

Object value引数をJComponentにキャストし、背景色を変更する可能性があります。大きな問題ではない。私が持っている質問は、なぜこのメソッドがsoooooと呼ばれることが多いのかということです。単一のセルを選択すると、23回呼び出されます。2つの関連のないアプリケーション間でAlt-Tabキーを押すと(私はWin7を使用します)、このメソッドは200回以上呼び出されます(JButtonsとJTextFieldsの場合のみ)。これは何らかの形で必要ですか?そうでない場合は、不要なレンダリング呼び出しを停止するにはどうすればよいですか?

2)2番目の質問は、JTable自体に関するものです。セルを編集していて(JTextFieldのカーソルが点滅している)、別のセルをクリックすると、そのセルのみが選択されます。ただし、別のセルをクリックすると、そのセルの編集が開始されます。私が考えることができるのは、最初の編集コンポーネントから、JTableを選択してから、その中のコンポーネントを選択しているということだけです。これを変更する方法はありますか?一方の方向(最初のクリックで常にjtableを選択)またはもう一方の方向(最初のクリックで常にセルに入る)のいずれかです。可能であれば、最初のオプションをお勧めします。

洞察/助けを与えることができる人に感謝します!

4

1 に答える 1

2

1)なぜTableModelにコンポーネントを保存するのですか?それは効率的ではありません。TableModelにデータを保存する必要があります。JTableは、単一のコンポーネントを使用してデータをレンダリングするように設計されています。デフォルトのレンダラーは通常、JLabelです。次に、セルを編集すると、別のコンポーネントが使用されます。

セルをクリックすると、前の行を再レンダリングして(行の選択を削除するため)、選択した行を現在の行にレンダリングする必要がある場合があります。したがって、レンダラーは、影響を受ける可視セルごとに呼び出されます。アプリケーションにタブで移動すると、表示されているすべてのセルが再レンダリングされる可能性があります。

2)これはデフォルトの動作ではないため、答えるのは難しいです。また、カスタムエディタを使用している必要がありますが、カスタムコードがどのように表示されるかわかりません。デフォルトのエディターには、デフォルトで2に設定されたsetClickCountToStart()メソッドがあります。おそらくこれを1に設定します。

TableModelでデータ(コンポーネントではなく)を使用するようにソリューションを変更し、さらに質問がある場合はSSCCEを投稿してください。

于 2011-09-02T22:44:18.730 に答える