1

JScrollPane を別のクラスから JPanel に追加しようとしています。そして、これまでに寄せられたいくつかの質問のおかげで、私は自分でそれらを作成することができました. しかし、私の問題はまだ少し特殊です。JPanel に画像を表示したいのですが、パネルに対して画像が大きすぎる場合は、スクロールバーを追加したいと考えています。しかし、スクロールバーは表示されません。(バーのフレームに設定するとScrollPaneConstants表示され****_SCROLLBAR_ALWAYSますが、スクロールするバーはありません)。

イメージサイズをバーに接続して表示する必要があると思いますか?

私のコードのいくつかの部分:

メインウィンドウ

public class Deconvolutioner extends JFrame
{
Draw z;
Picturearea picturearea;

class Draw extends JPanel
{
    public void paint(Graphics g)
    {

    }
}

public Deconvolutioner()
{
    setTitle("Deconvolutioner");
    setLocation(30,1);
    setSize(1300,730);
    super.setFont(new Font("Arial",Font.BOLD,11));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);

    FlowLayout flow = new FlowLayout(FlowLayout.CENTER);

    this.setLayout(flow);

    picturearea = new Picturearea();
    picturearea.setLayout(new GridBagLayout());

    JScrollPane scrollPane = new JScrollPane(picturearea, 
    ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    scrollPane.setPreferredSize(new Dimension(1000, 664));

    getContentPane().add(scrollPane, flow); // add scrollpane to frame


    add(z = new Draw());
    setVisible(true);

}
}

JPanel クラス

public class Picturearea extends JPanel
{
BufferedImage image;
int panelWidth, panelHeight, imageWidth, imageHeight;

public Picturearea()
{
    setBackground(new Color(210,210,210));
    setBorder(LineBorder.createBlackLineBorder());


    setVisible(true);
}

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);

}

public void setPicture(BufferedImage picture)
{
    try 
    {                
        image = picture;
    } 
    catch (Exception e) 
    {
        System.err.println("Some IOException accured (did you set the right path?): ");
        System.err.println(e.getMessage());
    }
    repaint();
}

}

御時間ありがとうございます。

4

2 に答える 2

2

問題は、JScrollPane がスクロール バーを表示するかどうかを判断する方法がないことです。これは、JScrollPane に含まれる Picturearea が優先サイズについて何も伝えないためです (または、レイアウトとただし、コンポーネントが含まれていないため、返される推奨サイズはおそらく(0, 0)) です。

カスタム Picturearea クラスの代わりに JLabel を使用するだけです。JLabel は画像を問題なく表示でき、適切なサイズを要求されると適切な Dimension を返します。

于 2013-10-27T13:43:14.700 に答える
0

JScrollPane のインスタンスを作成する前に、最初に JLabel を作成してから、JPanel ピクチャエリアに Label を追加できます。

試してみるとうまくいきます。

コード例は次のとおりです。

    JLabel imageLabel = new JLabel(new ImageIcon("d:\\099.jpg"));
    picturearea.add(imageLabel);**

    JScrollPane scrollPane = new JScrollPane(picturearea,
            ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
于 2013-10-27T13:55:31.217 に答える