带有空布局的JPanel的Scala Swing等价物
我正在用Scala编写一个Swing应用程序,希望通过坐标显式放置组件。在Java Swing中,这是通过将LayoutManager设置为null,然后手动添加如下组件来实现的:带有空布局的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
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