【问题标题】:Scala Swing equivalent of JPanel with null layoutScala Swing 等效于具有空布局的 JPanel
【发布时间】:2013-11-20 15:21:13
【问题描述】:

我正在用 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”的标签。但是,当我运行它时,面板是空的。我在这里做错了什么?如何实现具有任意内容放置的 Panel 类?

【问题讨论】:

    标签: swing scala layout panel


    【解决方案1】:

    布局管理器负责设置孩子的尺寸。如果您没有布局管理器,组件的初始大小通常为(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)
      }
    }
    

    【讨论】:

      【解决方案2】:

      您的 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。

      【讨论】:

        猜你喜欢
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2016-01-25
        • 1970-01-01
        相关资源
        最近更新 更多