我正在尝试使用 java 中的 jPanel 和 jFrame 使图像可滚动。我在drawQuestion类中绘制图像,然后将drawQuestion添加到jScrollPanel并且它不滚动。请告诉我我的错误在哪里,我已经尝试了好几天了,但仍然找不到它。 抱歉我的英语不好。
main.java:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class main{
private static int width = 800;
private static int height = 450;
public static void main(String[] args){
JFrame window = new JFrame("DPA Physics 2013 9 class");
drawQuestion question = new drawQuestion();
JScrollPane scroll = new JScrollPane(question);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(width,height);
window.setLocationRelativeTo(null);
window.add(scroll);
window.setVisible(true);
}
}
drawQuestion.java:
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class drawQuestion extends JPanel{
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g){
super.paintComponent(g);
Image image1 = new ImageIcon(this.getClass().getResource("Page1.png")).getImage();
g.drawImage(image1,0,0,this);
}
}
最佳答案
您尚未为 drawQuestion
面板指定(首选)尺寸,这意味着所有布局现在都认为它的尺寸为 0x0...
您永远不应该在任何 paint
方法中加载或执行任何可能需要少量时间才能完成的任务...
您需要重写getPreferredSize
方法以返回所需的面板大小。这将允许滚动 Pane 确定面板是否需要滚动...
public class DrawQuestion extends JPanel{
private static final long serialVersionUID = 1L;
private Image image1;
public DrawQuestion() {
image1 = new ImageIcon(this.getClass().getResource("Page1.png")).getImage();
}
public Dimension getPreferredSize() {
return image1 == null ? super.getPreferredSize() : new Dimension(image1.getWidth(this), image1.getHeight(this));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if (image1 != null) {
g.drawImage(image1,0,0,this);
}
}
}
当我在墙上时...我还推荐使用 ImageIO
而不是 ImageIcon
,因为如果图像 ImageIO
会抛出异常无法加载...
关于Java JPanel 不会滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16249290/