2

線、円、長方形などの非常に単純なグラフィックを描画するクラスがあります。線は動的に拡張可能であり、解像度を超えて拡張すると、スクロールバーなしでは表示できない場合があります。そのため、JFrameにJScrollPaneを追加しましたが、残念ながら、レイアウトマネージャーを既に呼び出しているにもかかわらず、スクロールバーはスクロールできません。

私が持っているものは次のとおりです。-コンポーネント(線、長方形、円)を描画するクラス-JFrame/JScrollPaneを設定するクラス

これが私のGUIクラスの抜粋コードです:

    JFrame frame = new JFrame("GUIFrame");
    frame.setLayout(new BorderLayout()); // Layout already set
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    DrawComponent comp = new DrawComponent(); // Reference to class that draw components
    JScrollPane sp = new JScrollPane(comp, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    sp.setPreferredSize(new Dimension(1000, 1000));

    frame.add(sp, BorderLayout.CENTER);
    frame.setSize(500,500);
    frame.setVisible(true);

上記のコードで、Javaにjcomponentsを含むスクロールペインを備えたJFrameを表示させることができます。スクロールバーを常に上記のように表示するように設定しましたが、スクロールできず、灰色で表示されます。

Andrewが提案したように、私は自分がやろうとしていることを反映するSSCCEを作成するのに少し時間がかかりました。

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.Random;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;


public class DrawTest {
    public static void main(String[] args){
        JFrame frame = new JFrame("SSCCE");
        frame.setLayout(new BorderLayout());
        frame.setSize(1000, 1000);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       

        DrawComp d = new DrawComp();
        JScrollPane sp = new JScrollPane(d, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

        frame.add(sp);      
        frame.setVisible(true);
    }
}

class DrawComp extends JComponent {

    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        Random ran = new Random();
        int ranNum = ran.nextInt(10);
        System.out.println(ranNum);
        double length = 100 * ranNum;
        g2.draw(new Line2D.Double(10, 10, length, length));
    }
}

上記のコードは、ランダムな入力に基づいて対角線を描画します。私がやろうとしているのは、線が長くなりすぎてフレームサイズを超えたときに、スクロールして線全体を表示できるようになることを願っています。ここでも、線コンポーネントをJScrollPaneに追加しましたが、スクロールできません。

4

2 に答える 2

1

謝罪いたします。JScrollPaneを正しい方法で使用しています。私はあなたのコードを実行しましたが、JScrollPaneが機能しない理由がわかったと思います。これを想像してみてください。jframeの背景をすべて赤に設定した場合(どこにでも赤い点を付けることによって)、jscrollpaneはスクロール可能である必要がありますか?いいえ、背景色のペイントは背景にあるためです。実際のVIEWは変更されず、表示サイズよりも大きくないため、スクロールペインにはスクロールのポイントが表示されません。ペイントコンポーネントメソッドは、同様のことを行っています。背景に何かを描いているだけです。実際のビューは変更されなかったため、スクロールペインは機能しません。

public class DrawTest {
    public static void main(String[] args){
        JFrame frame = new JFrame("SSCCE");
        frame.setLayout(new BorderLayout());
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       

        final DrawComp d = new DrawComp();
        final JScrollBar hbar,vbar;
        hbar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 500);
        vbar = new JScrollBar(JScrollBar.VERTICAL, 0, 1, 0, 500);

        frame.setLayout(null);
        frame.add(d);      
        frame.add(hbar);      
        frame.add(vbar);      
        d.setBounds(0, 0, 300, 300);
        vbar.setBounds(460, 0, 20, 480);
        frame.setVisible(true);

        vbar.addAdjustmentListener(new AdjustmentListener() 
        {
            public void adjustmentValueChanged(AdjustmentEvent e) 
            {
                d.setLocation(d.getX(), -vbar.getValue());
            }
        });
    }
}

コンポーネントを垂直方向にスライドさせるためのコードは次のとおりです。既存のコードにいくつか変更を加えました。DrawCompはまだ同じです

于 2013-01-02T05:07:24.223 に答える
0

私は自分の問題に対するその場しのぎの解決策を見つけました。描画がいかに単純であるかを考えると、preferredSizeをオーバーライドするために線の終点を使用することにしました。

上で投稿したSSCCEに関連して、paintComponent ()にsetPreferredSize(new Dimension(length、length))を追加して、preferredSizeが呼び出されたときに常に行の終点になるようにしました。これにより、必要に応じて、絵画の全領域が覆われ、スクロールできるようになります。

于 2013-01-02T08:17:07.127 に答える