1

我正在 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 面板的窗口,其中包含一个标签,其文本“HI”在坐标 (55,55) 处。但是,当我运行它时,面板是空的。我在这里做错了什么?如何实现具有任意内容放置的 Panel 类?

4

2 回答 2

2

布局管理器负责设置孩子的尺寸。如果您没有布局管理器,组件的初始大小通常为(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)
  }
}
于 2013-11-08T17:27:27.307 回答
1

Your Java and Scala code are not equivalent. To make it so, the Scala code should look like:

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)
  }
}

Another problem IMO is that you're setting width and height of component using it default component bounds, which seems to be 0.

于 2013-11-08T17:29:55.660 回答