2013-04-27 73 views
2

我正在尝试使用jPanel和jFrame在Java中进行图像滚动。我在drawQuestion类中绘制了我的图像,然后向jScrollPanel添加了drawQuestion,并且它不滚动。请告诉我我的错误在哪里,我一直在寻找几天,我仍然无法找到它。 对不起,我的英语不好。Java JPanel不会滚动

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); 
} 
} 
+0

1)'drawQuestion'应该被称为'DrawQuestion'或者更好的'DrawableQuestion',它应该*返回一个与图像大小相同的首选大小。* 2)Image image1 = new ImageIcon (this.getClass()。getResource(“Page1.png”))。getImage();应该在面板创建时加载图像,或者在构造函数中传递给面板。 3)更容易的是在滚动窗格中的“JLabel”中显示图像。 [E.G.](http://stackoverflow.com/a/13463684/418556) – 2013-04-27 07:00:07

回答

3

你没有指定(首选)大小为drawQuestion面板,这意味着所有的布局,现在认为这是为0x0大小...

你永远不应该加载或执行任何可能需要少量时间才能完成的任何paint方法...

您需要覆盖getPreferredSize方法以返回所需的面板大小。这将允许滚动窗格,以确定是否需要面板滚动...

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过如果图像可以作为ImageIconImageIO抛出异常't is loaded ...

+0

@AndrewThompson在技术上,min或max也是,但是 - 更新 – MadProgrammer 2013-04-27 07:03:51