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 无法知道它是否应该显示滚动条,因为它包含的 Picturearea 并没有说明它的首选大小(或者更确切地说,它根据其布局和它包含的组件。但由于它不包含任何组件,因此返回的首选大小可能是(0, 0))。

我会简单地使用 JLabel 而不是自定义的 Picturearea 类。JLabel 可以很好地显示图像,并在询问其首选尺寸时返回适当的 Dimension。

于 2013-10-27T13:43:14.700 回答
0

您可以先创建一个 JLabel ,然后在为 JScrollPane 创建实例之前将标签添加到 JPanel 图片区域。

试一试,它会起作用的。

示例代码如下:

    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 回答