0

私はこのコードを持っています、それCanvasを拡張する私が作ったクラスはJPanel画像を保持します。しかし、私がそれを使用すると、キャンバスは上ではJScrollPaneなく後ろに配置されます。なぜそれをしているのですか?

ScrollPanelの作成方法は次のとおりです。

imagePane.setBackground(new java.awt.Color(153, 153, 153));
imagePane.setBorder(null);
jSplitPane2.setRightComponent(imagePane);

ScrollPanel内のパネルの配置は次のとおりです

Canvas canvas = new Canvas();
canvas.setVisible(true);
canvas.setImage(file);
imagePane.setLayout(new GridBagLayout());
canvas.setSizeFromLoaded();
imagePane.add(canvas);
imagePane.repaint();

キャンバスクラスは、パネルの配置には何もしません。パネルをビルドして変更するだけです。私はJPanelそこにあり、それは機能しましたが、それを切り替えると、JScrollPanelその後ろにキャンバスが配置され始めました。

4

3 に答える 3

1
于 2012-11-26T17:56:04.520 に答える
1

すべての軽量コンポーネント(JPanel、JScrollPaneなど)を使用していることを確認してください。JPanel Canvasの独自のサブクラスに名前を付けたと思いますが、CanvasとScrollPaneはAWTクラスであるため、コードと説明がやや混乱しています。

コメントで、imagePaneはScrollPaneであるとおっしゃいました(JScrollPaneを意味していると思います)。その場合、imagePane.setLayoutは適切ではないため、削除する必要があります。コードは次のようになります。

Canvas canvas = new Canvas();
canvas.setImage( someImageFile );
canvas.setSizeFromLoaded();

JScrollPane imagePane new JScrollPane( canvas );
imagePane.setBackground(new java.awt.Color(153, 153, 153));
imagePane.setBorder( null );

jSplitPane2.setRightComponent( imagePane );

setSetFromLoaded()が画像のサイズに基づいてキャンバスのPreferredSizeを設定できる場合、これは機能します。画像がまだ読み込まれていないためにサイズを計算する準備ができていない場合(これは別のスレッドで頻繁に発生することを忘れないでください)、計算をvalidate()に移動し、後で実行する必要があります。たとえば、doLayout()をオーバーライドすると、コンポーネントがrevalidated()されたときに希望のサイズを計算できるのはなぜですか。子を追加する必要がないため、JPanelの代わりにJComponentをサブクラス化することも検討する必要があります。JPanelと同じことがJComponentにも当てはまります。

于 2012-11-26T18:19:12.177 に答える
0

これを修正するために私が思いついた問題は、これを使用することです。
imagePane.getViewport().add(canvas);

これの代わりに:
imagePane.add(canvas);

于 2012-11-26T18:08:38.403 に答える