【发布时间】:2018-07-04 14:47:27
【问题描述】:
这是我第一次提问,请原谅我提问的错误,如果发生这种情况,请告诉我如何提出更好的问题。
我在问什么:
如何将成员函数添加到匿名对象中,该对象可在该对象外部调用?还是这个要求太奇怪了不应该实现?
考虑下面这个object expression:
variable = object : AClass()
{
// inside the declaration of anonymous object
override fun aFunction(i: Int)
{
// do something inside aFunction
}
}.apply {
// do something inside apply
}
如何添加一个函数fun bFunction(i: Int),只是属于variable,不属于AClass,可以直接使用
variable.bFunction(1)
?或者,不可能?
我已经尝试过(当然,没有满足我想要的):
- 我可以创建一个extension function
fun AClass.bFunction(i: Int)来解决它,但这对于AClass的其他实例可能“不公平”,因为它们实际上并不需要它。 - 我可以创建一个类而不是在本地使用匿名对象,但是为 ONE 变量创建一个类似乎太重了。
- 我尝试在匿名对象的声明中添加
bFunction,其中位置如上所述。但是我只能在.apply {}内部访问这个函数,而不是在这个分配之外。 - 我尝试在
.apply {}中添加bFunction,但这也让我只能在.apply {}中访问它,而不是在此任务之外。
更具体的原始问题(由我自己解决,同时输入此问题)以避免 X - Y 问题:
我正在努力在 Java GUI 组件上绘画。我想要实现的就像JFrame 中的“画布”或“纸”,我可以通过像素控制在上面绘制任何我喜欢的东西,完全使用 Kotlin。
经过一番搜索,我找到了问题的核心解决方案,“如果我使用contentPane.graphics.drawXXX系列函数绘制一些东西,这个draw会在(我调整这个JFrame的大小或最小化,或者只是调用这个draw)时消失函数太早,当这个 JFrame 显示时(注意:我们可以使用Thread.sleep 来延迟太早的调用))”,是by overriding paint function。然后,为了覆盖它,我使用var image = BufferedImage(...) 来存储我绘制的内容,并使用匿名对象
painting = object : JFrame()
{
override fun paint(g: Graphics?)
{
contentPane.graphics.drawImage(image, 0, 0, this)
}
}.apply { /* do some initialization */ }
重写paint函数,并将这个缓冲的图像绘制到contentPane中,这似乎实现了我想要的,只是一个“静态”绘画。
我想知道如何向这个painting 添加一个updatePainting() 函数,这样我就可以修改这个缓冲的图像,然后调用这个函数来更新绘画,作为一个“动态”绘画。 但是,在我输入这个问题的过程中,我无意中发现,只要修改这张图片,就会自动更新这幅画,不需要手动更新这幅画。 所以这个原始问题实际上解决了:在我目前的情况下,这个 bFunction 是不必要的。但是,我只是想知道,有没有什么方法可以解决这个(可能很奇怪)的问题?
【问题讨论】:
标签: kotlin