Можно ли использовать абсолютное позиционирование компонентов в Scala/Swing?
Я использую Swing в Scala "org.scala-lang" % "scala-swing" % "2.11.0-M7"
, Я хочу установить положение для моих компонентов явно. Это можно делать в Swing API для Java.
Вопрос: возможно ли установить абсолютную позицию для компонентов в Swing Scala API?
Пример Swing API для Scala:
import scala.swing._
object PositionAbsolute extends SimpleSwingApplication {
lazy val top = new MainFrame() {
title = "PositionAbsolute"
val label = new Label("I want to be at (0, 0)")
val panel = new FlowPanel()
panel.preferredSize = new swing.Dimension(300, 400)
panel.contents += label
contents = panel
}
}
1 ответ
Я знаю, что немного запоздал с ответом - и я совсем не эксперт в этих вещах, поэтому, пожалуйста, потерпите меня.
Если вы абсолютно хотите или должны сделать абсолютное позиционирование элементов управления с помощью качания в scala, вот способ сделать это:
import scala.swing.{Button, Dimension, MainFrame}
object Main extends App {
val b1 = new Button {
text = "one"
preferredSize = new Dimension(60, 30)
}
val b2 = new Button {
text = "two"
preferredSize = new Dimension(80, 40)
}
val b3 = new Button("three")
b1.peer.setBounds(25, 5, b1.peer.getPreferredSize.width, b1.peer.getPreferredSize.height)
b2.peer.setBounds(55, 50, b2.peer.getPreferredSize.width, b2.peer.getPreferredSize.height)
b3.peer.setBounds(150, 15, b3.peer.getPreferredSize.width, b3.peer.getPreferredSize.height)
javax.swing.SwingUtilities.invokeLater(() => {
val frame: MainFrame = new MainFrame {
title = "AbsoluteLayoutDemo"
resizable = true
size = new Dimension(300, 150)
}
frame.peer.setLayout(null)
frame.peer.add(b1.peer)
frame.peer.add(b2.peer)
frame.peer.add(b3.peer)
frame.visible = true
})
}
Мне самому это не очень нравится, но это работает. Я скомпилировал этот код с помощью scala версии 2.13.8 и
libraryDependencies += "org.scala-lang.modules" %% "scala-swing" % "3.0.0"
в файле build.sbt
Это был мой перевод java-примера в docs.oracle.com/javase/tutorial/uiswing/layout/none.html .
но я сделал несколько изменений, которые, по моему мнению, будут иметь смысл для примера Scala.
Я не совсем уверен, каковы последствия такого подхода, поэтому используйте его на свой страх и риск, потому что я действительно не уверен, как это работает.