2

私はこれを正しく理解できません。JPanel のサイズを大きくするためのスライダーがあります (描画するキャンバスとして使用されます)。

JPanel がイベントを受信するたびに、setBounds() でサイズを変更すると、一瞬サイズが変更されるのがわかりますが、次の Paint などで、スライダーの優先サイズ プロパティによって指定された元のサイズに戻ります。

public class ShapesMainFrame extends JFrame {
    private PaintCanvas paintCanvas;
    public ShapesMainFrame() {
        [...]
        JScrollPane scrollPane = new JScrollPane(paintCanvas);
        scrollPane.setPreferredSize(new Dimension(1,600));
        add(scrollPane, BorderLayout.CENTER);
        pack();
    }
}

public class PaintCanvas extends JPanel {
    [...]
    public void setScale(int value) {
        setSize(1000,1000);
    }
}

JPanel のサイズを大きな値に変更しようとすると、サイズが変更され、スクロールバーが正しく表示されるはずです。最初に設定したときと同じ600pxの高さのままです。

4

2 に答える 2

9

レイアウト マネージャーを使用する場合は、setSize() または setBounds を使用しないでください。重要なのは「好みのサイズ」です。通常、コンポーネントの適切なサイズは、レイアウト マネージャーによって自動的に決定されます。ただし、パネルでカスタム ペイントを行う場合は、適切なサイズを手動で決定する必要がある場合があります。

スクロール バーは、パネルの優先サイズがスクロール ペインのサイズよりも大きい場合に表示されます。getPreferredSize() メソッドをオーバーライドするか (推奨される解決策)、カスタム パネルの setPreferredSize() メソッドを使用します。

于 2010-11-17T01:37:15.047 に答える
5

サイズを更新した後、JScollPane 内のコンテンツに対して revalidate() を呼び出すだけです。また、レイアウト マネージャーを使用する場合は setPreferredSize() を使用します。

public void setScale(int value) {
     setPreferredSize(new Dimension(1000, 1000);   
     revalidate();
}

これにより、JScrollPane がスクロールバーを強制的に更新します。

また、あなたは呼び出すことができます

paintCanvas.revalidate()

paintCanvas クラスの外から JScrollPane を更新したい場合

于 2010-12-31T20:19:31.797 に答える