Java Swing:JScrollPane 不适用于 JPanel 中的缓冲图像
Java Swing: JScrollPane doesn't work with Buffered Image in a JPanel
这是我的 JFrame
class,它应该显示一个高度和宽度为 2000 像素的图像。显示区域应该只有 width
和 height
的 800px
并且我希望能够使用滚动条到达其余的 2000px。但目前只有 800x800 像素的 Frame,无法滚动图片。我可以看到滚动条,但无法滚动它。如果我将 window 拖动得更大,我只能看到更多图片。
我的代码现在正在做什么:创建 Panel
class 的实例 panel
,它显示高度:2000 像素和宽度:2000 像素的图像。然后我创建一个 JScrollPane
并传递 panel
实例。
如果我不使用行 setHorizontalScrollBarPolicy
,setVerticalScrollBarPolicy
我什至看不到滚动条。如果我使用这两行,我会看到一个用于水平和垂直滚动的滚动条,但我无法使用它们,因为看起来图片已最大化。
这是我的相框class:
public class Frame extends JFrame {
public Frame() {
Panel panel = new Panel();
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(scrollPane);
this.getContentPane().setPreferredSize(new Dimension(800, 800));
panel.generateImage();
setVisible(true);
pack();
}
这是生成图像的class
public class Panel extends JPanel {
private BufferedImage img;
public Panel() {
img= new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null);
}
public void generateImage () {
//...image gets generated here
repaint();
}
}
这是一个例子,它现在的样子。狗只是一个例子,但它希望能使我的问题更清楚-> 我想滚动图像以便我可以看到狗的其他部分。
您可能忘记了面板的首选大小,因为这是用于扩展 JScrollPane 视口中的 JPanel“视图”的大小。考虑通过执行以下操作覆盖绘图 JPanel 中的 getPreferredSize:
@Override
public Dimension getPreferredSize() {
if (img == null) {
return super.getPreferredSize();
} else {
int w = img.getWidth();
int h = img.getHeight();
return new Dimension(w, h);
}
}
当然要导入java.awt.Dimension
这是我的 JFrame
class,它应该显示一个高度和宽度为 2000 像素的图像。显示区域应该只有 width
和 height
的 800px
并且我希望能够使用滚动条到达其余的 2000px。但目前只有 800x800 像素的 Frame,无法滚动图片。我可以看到滚动条,但无法滚动它。如果我将 window 拖动得更大,我只能看到更多图片。
我的代码现在正在做什么:创建 Panel
class 的实例 panel
,它显示高度:2000 像素和宽度:2000 像素的图像。然后我创建一个 JScrollPane
并传递 panel
实例。
如果我不使用行 setHorizontalScrollBarPolicy
,setVerticalScrollBarPolicy
我什至看不到滚动条。如果我使用这两行,我会看到一个用于水平和垂直滚动的滚动条,但我无法使用它们,因为看起来图片已最大化。
这是我的相框class:
public class Frame extends JFrame {
public Frame() {
Panel panel = new Panel();
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(scrollPane);
this.getContentPane().setPreferredSize(new Dimension(800, 800));
panel.generateImage();
setVisible(true);
pack();
}
这是生成图像的class
public class Panel extends JPanel {
private BufferedImage img;
public Panel() {
img= new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null);
}
public void generateImage () {
//...image gets generated here
repaint();
}
}
这是一个例子,它现在的样子。狗只是一个例子,但它希望能使我的问题更清楚-> 我想滚动图像以便我可以看到狗的其他部分。
您可能忘记了面板的首选大小,因为这是用于扩展 JScrollPane 视口中的 JPanel“视图”的大小。考虑通过执行以下操作覆盖绘图 JPanel 中的 getPreferredSize:
@Override
public Dimension getPreferredSize() {
if (img == null) {
return super.getPreferredSize();
} else {
int w = img.getWidth();
int h = img.getHeight();
return new Dimension(w, h);
}
}
当然要导入java.awt.Dimension