【发布时间】:2013-12-07 16:35:53
【问题描述】:
我已经做了几个小时了,但没有取得任何进展。
我有一个非常简单的应用程序,它从磁盘加载一个大 (2000x2500px) 图像。
它加载到一个 JPanel 中,该 JPanel 包含在 JScrollPanel 中,而 JScrollPanel 又包含在最外面的 JPanel 中。
这段代码在 Scala 中,但对于 Java 开发人员来说应该很容易阅读。
当我移动滚动条时,应用程序会打印出正在重新绘制的指示,但图像部分是空白的。当我调整应用程序窗格的大小时,一切都正确绘制。
这是一个错误还是我错过了一些非常基本的东西?
import java.awt._
import java.util.Date
import javax.imageio.ImageIO
import javax.swing._
object DisplayAnImage {
def main(args: Array[String]) = {
val rackStream = DisplayAnImage.getClass.getResourceAsStream("racks.jpg")
val bi = ImageIO.read(rackStream)
val outerMost = new JFrame("Image display")
outerMost.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
outerMost.setLayout(new BorderLayout())
val imagePane = new JPanel(true) {
val c = new Canvas() {
override def paint(g: Graphics): Unit = {
println(s"drawing the image ${new Date()}")
g.drawImage(bi, 0, 0, null)
}
}
c.setSize(bi.getWidth, bi.getHeight)
this.add(c)
}
val scroller = new JScrollPane(imagePane)
scroller.setAutoscrolls(true)
outerMost.add(scroller, BorderLayout.CENTER)
outerMost.pack()
outerMost.setSize(300, 300)
outerMost.setVisible(true)
}
}
解决方案
感谢 camackr - 我将代码修改为以下,它更简单并且可以完美运行。
import java.awt._
import javax.imageio.ImageIO
import javax.swing._
object DisplayAnImage {
def main(args: Array[String]) = {
val rackStream = DisplayAnImage.getClass.getResourceAsStream("racks.jpg")
val bi = ImageIO.read(rackStream)
val outerMost = new JFrame("Image display")
outerMost.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
outerMost.setLayout(new BorderLayout())
val imagePane = new JPanel(true) {
val jl = new JLabel() {
override def paintComponent(g: Graphics): Unit = {
g.drawImage(bi, 0, 0, null)
}
this.setPreferredSize(new Dimension(bi.getWidth,bi.getHeight))
}
this.add(jl)
}
val scroller = new JScrollPane(imagePane)
scroller.setAutoscrolls(true)
outerMost.add(scroller, BorderLayout.CENTER)
outerMost.pack()
outerMost.setSize(300, 300)
outerMost.setVisible(true)
}
}
【问题讨论】:
标签: java swing panel jscrollpane repaint