Адаптация ImagePanel в Scala - PullRequest
       21

Адаптация ImagePanel в Scala

1 голос
/ 12 декабря 2011

Я начинаю с кода, который был найден здесь и его можно увидеть ниже:

import swing._                                                                

import java.awt.image.BufferedImage                                           
import java.io.File                                                           
import javax.imageio.ImageIO                                                  

class ImagePanel extends Panel                                                
{                                                                             
  private var _imagePath = ""                                                 
  private var bufferedImage:BufferedImage = null                              

  def imagePath = _imagePath                                                  

  def imagePath_=(value:String)                                               
  {                                                                           
    _imagePath = value                                                        
    bufferedImage = ImageIO.read(new File(_imagePath))                        
  }                                                                           


  override def paintComponent(g:Graphics2D) =                                 
  {                                                                           
    if (null != bufferedImage) g.drawImage(bufferedImage, 0, 0, null)         
  }                                                                           
}                                                                             

object ImagePanel                                                             
{                                                                             
  def apply() = new ImagePanel()                                              
} 

Использование:

object ImagePanelDemo extends SimpleSwingApplication
{

  def top = new MainFrame {
    title = "Image Panel Demo"

    contents = new ImagePanel
    {   
      imagePath = ("../testImage.jpg")
    }   
  }
}

Я хочу расширить это и придать панели изображений форму GridPanel. Я хочу, чтобы панель изображений была GridPanel с фоном изображения. Кто-нибудь знает, как это реализовать?

Моя текущая реализация выглядит следующим образом:

class ImagePanel(rows0: Int, cols0: Int) extends GridPanel(rows0, cols0)                                                
{                                                                             
  private var _imagePath = ""                                                 
  private var bufferedImage:BufferedImage = null                              

  def imagePath = _imagePath                                                  

  def imagePath_=(value:String)                                               
  {                                                                           
    _imagePath = value                                                        
    bufferedImage = ImageIO.read(new File(_imagePath))                        
  }                                                                           


  override def paintComponent(g:Graphics2D) =                                 
  {                                                                           
    if (null != bufferedImage) g.drawImage(bufferedImage, 0, 0, null)         
  }                                                                           
}                                                                             

object ImagePanel                                                             
{                                                                             
  def apply() = new ImagePanel()                                              
}

Я получаю ошибку в объекте ImagePanel. У меня слишком мало аргументов. Я не знаю, как именно добавить новые аргументы строк и столбцов.

1 Ответ

3 голосов
/ 12 декабря 2011

Все, что вам нужно сделать, это вместо этого создать подкласс GridPanel.Если вы измените свою первую строку на

class ImagePanel(rows0: Int, cols0: Int) extends GridPanel(rows0, cols0)

, это сработает.

РЕДАКТИРОВАТЬ:

Я не знаю, какую ошибку вы получаете - изКонечно, теперь вам нужно создать ImagePanel с аргументами для количества строк и столбцов ...

import scala.swing._
import java.awt.image.BufferedImage
import java.net.URL
import javax.imageio.ImageIO

class ImagePanel(rows0: Int, cols0: Int) extends GridPanel(rows0, cols0) {
  private var _imagePath = ""                                                 
  private var buf = Option.empty[BufferedImage]

  def imagePath = _imagePath
  def imagePath_=(value: String): Unit = {
    _imagePath = value
    buf.foreach(_.flush()); buf = None
    buf = Some(ImageIO.read(new URL(value)))
    repaint()
  }

  override def paintComponent(g: Graphics2D): Unit = {
    super.paintComponent(g)
    buf.foreach(g.drawImage(_, 0, 0, null))
  }
}

val f        = new Frame()
val p        = new ImagePanel(3, 2)
p.imagePath  = "http://www.scala-lang.org/api/current/lib/package_big.png"
p.contents ++= Seq.tabulate(p.rows * p.columns)(i => new Label((i + 1).toString))
f.contents   = p
f.visible    = true
...