1

座標によるコンポーネントの明示的な配置が必要な Scala で Swing アプリケーションを作成しています。Java Swing では、これは LayoutManager を null に設定し、次のようにコンポーネントを手動で追加することによって行われます。

JPanel p = new JPanel(null);
JLabel l = new JLabel("hi");
l.setLocation(3,3);
p.add(l);

これに似たソリューションを使用して、Web で 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
  }
}

直観的に、これにより、座標 (55,55) にテキスト "HI" を持つラベルを含む 500 x 500 のパネルを持つウィンドウが作成されます。ただし、これを実行すると、パネルは空です。ここで何が間違っていますか?コンテンツを任意に配置して 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

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 のもう 1 つの問題は、デフォルトのコンポーネント境界を使用してコンポーネントの幅と高さを設定していることです。これは 0 のようです。

于 2013-11-08T17:29:55.660 に答える