Можно ли использовать абсолютное позиционирование компонентов в 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.

Я не совсем уверен, каковы последствия такого подхода, поэтому используйте его на свой страх и риск, потому что я действительно не уверен, как это работает.

Другие вопросы по тегам