带有空布局的JPanel的Scala Swing等价物

带有空布局的JPanel的Scala Swing等价物,swing,scala,layout,panel,Swing,Scala,Layout,Panel,我正在用Scala编写一个Swing应用程序,希望通过坐标显式放置组件。在Java Swing中,这是通过将LayoutManager设置为null,然后手动添加如下组件来实现的: JPanel p = new JPanel(null); JLabel l = new JLabel("hi"); l.setLocation(3,3); p.add(l); 我在网上看到过几篇关于Scala等价物的帖子,所有帖子都使用类似的解决方案: import scala.swing._ class Nul

我正在用Scala编写一个Swing应用程序,希望通过坐标显式放置组件。在Java Swing中,这是通过将LayoutManager设置为null,然后手动添加如下组件来实现的:

JPanel p = new JPanel(null);
JLabel l = new JLabel("hi");
l.setLocation(3,3);
p.add(l);
我在网上看到过几篇关于Scala等价物的帖子,所有帖子都使用类似的解决方案:

import scala.swing._

class NullPanel extends Panel {
  peer.setLayout(null)

   protected def add(comp: Component, x: Int, y: Int) {
     comp.peer.setBounds(new Rectangle(x,y,comp.bounds.width,comp.bounds.height))
     peer.add(comp.peer)
  }
}
如果我在以下应用程序中使用此类:

import scala.swing._

object Frame extends SimpleSwingApplication{
  val pan = new NullPanel {
    preferredSize = new Dimension(500,500)
    add(new Label("HI"),55,55)
  }

  def top = new MainFrame {
    contents = pan
  }
}

直观地说,这将创建一个带有500 x 500面板的窗口,其中包含一个在坐标(55,55)处带有文本“HI”的标签。但是,当我运行此命令时,面板是空的。我做错了什么?如何实现具有任意内容放置的面板类?

布局管理器负责设置子对象的尺寸。如果没有布局管理器,元件的初始尺寸通常为
(0,0)
。解决方法是将尺寸设置为组件的首选尺寸。这意味着您以前配置过组件,因此正确确定了首选大小

class NullPanel extends Panel {
  peer.setLayout(null)

  protected def add(comp: Component, x: Int, y: Int): Unit = {
    val p = comp.peer
    p.setLocation(x, y)
    p.setSize(p.getPreferredSize) // !
    peer.add(p)
  }
}

您的Java和Scala代码是不同的。为此,Scala代码应该如下所示:

import scala.swing._

class NullPanel extends Panel {
  peer.setLayout(null)

   protected def add(comp: Component, x: Int, y: Int) {
     comp.peer.setLocation(x,y)
     peer.add(comp.peer)
  }
}
IMO的另一个问题是,您正在使用默认组件边界设置组件的宽度和高度,它似乎是0