如何解决如何在 Scala.js 项目中提供 JDK 类如 java.awt的存根实现?
这是我尝试提供与 java.awt
相关的 Graphics2D
部分的虚拟实现:
package java
package object awt {
object RenderingHints {
type Key = Int
val KEY_TEXT_ANTIALIASING = 0
val VALUE_TEXT_ANTIALIAS_ON = 0
}
object Color {
val GREEN = 0
}
type Color = Int
object image {
object BufferedImage {
val TYPE_INT_RGB = 0
}
class BufferedImage(w: Int,h: Int,tpe: Int) {
def createGraphics: Graphics2D = new Graphics2D
}
}
class Graphics2D {
def setColor(c: Color): Unit = ()
def fillRect(x: Int,y: Int,width: Int,height: Int): Unit = ()
def setRenderingHint(hintKey: RenderingHints.Key,hintValue: Any): Unit = ()
def drawString(str: String,x: Int,y: Int): Unit = ()
def dispose() = ()
}
}
此存根实现旨在允许在 JVM / Scala.js 之间使用 Graphics2D
交叉编译函数,代码如下:
import java.awt.image.BufferedImage
import java.awt
val bim = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB)
val g2d = bim.createGraphics()
g2d.setColor(aw.Color.GREEN)
g2d.fillRect(0,10,10)
g2d.setRenderingHint(awt.RenderingHints.KEY_TEXT_ANTIALIASING,awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
g2d.setColor(awt.Color.BLACK)
g2d.drawString("Hello",20)
g2d.dispose()
代码在 JVM 和 JS 上都编译得很好,问题是它没有通过 fastOptJS
,我得到如下错误:
[错误] 引用不存在的类 java.awt.image.BufferedImage
[错误] 引用不存在的类 java.awt.Graphics2D
事实上,即使没有我的 java.awt
存根,代码也能很好地编译,因此 Scala.js 似乎以某种方式使用了其他一些 java.awt
源,可能来自 JDK。有没有办法说服编译器改用我提供的类?
解决方法
对象内的类(包括包对象)和包在二进制(即类文件)级别(在 Scala JVM 和 Scala.js 中都不是)上不是一回事。
您需要将类放入各自的包中(不是对象):
package java.awt
object RenderingHints {
class Key { /* snip */ }
val KEY_TEXT_ANTIALIASING = 0
val VALUE_TEXT_ANTIALIAS_ON = 0
}
class Color { /* snip */ }
object Color { /* snip */ }
class Graphics2D { /* snip */ }
package java.awt.image
class BufferedImage { /* snip */ }
object BufferedImage { /* snip */ }
此外,从示例中可以看出,您不能使用类型别名来代替类。二进制级别不存在类型别名,因此需要一个真正的类。
如果您需要嵌套的静态对象,则需要在 Scala.js 编译器中明确启用这些对象(参见 #3950 的末尾)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。