2016-03-31 15 views
2

私はScala-swingフロントエンドでアプリケーションを開発しています。私は大量に読み込まれているMainFrameを持っています。私はあまりにもうまくいくダイアログを持っています。しかし、ダイアログから親フレームにアクセスすると、フレームの内容がクリアされます。 MemuBarはまだそこにあります。Scala-Swingダイアログが親、親コンテンツにアクセスするときに

フレーム上にダイアログの中心を合わせるだけで、私はポイントを渡しただけです。私はちょうどそれを行うためにフレームにアクセスすることはできませんダイアログで作成された位置ポイントを設定することができます。そして、私は実際には得られません。私はフレーム内のポイントを作成し、それをダイアログに送信しますが、これは問題ありませんが、ダイアログの位置を設定するとフレームがクリアされます。

私は "org.scala-lang.modules" を使用しています%、 "スカラ座-swing_2.11" % "1.0.2"

いずれも、任意のアイデアがありますか?

ありがとうございます!

一方、このデモのコードは正常に動作し、それは簡単ではありませんので

package hack 

import scala.swing.{Action, BorderPanel, Button, Dialog, Dimension, FlowPanel, Frame, MainFrame, Menu, MenuBar, MenuItem, SimpleSwingApplication, TabbedPane} 

/** 
    * Created by bday on 3/31/16.<br> 
    * <br> 
    * FrameClearingDialog will do something useful I'm sure 
    */ 
class FrameClearingDialog (parent: Frame) { 
    val dialog = new Dialog 
    dialog.contents = new FlowPanel() { 
    preferredSize = new Dimension(500,500) 
    } 
    dialog.open() 
    dialog.setLocationRelativeTo(parent) 
} 

class Parent extends SimpleSwingApplication { 
    override def top: Frame = new MainFrame { 
    title = "Hack " 
    preferredSize = new Dimension(1000,1000) 
    menuBar = new MenuBar() { 
     contents += new Menu("Menu") { 
     contents += new MenuItem(Action("Show Dialog") { 
      createAndShowDialog 
     }) 
     } 
    } 
    val panel = new BorderPanel() { 
     layout(new Button() {text="button"}) = BorderPanel.Position.North 
     layout(new Button() {text="button"}) = BorderPanel.Position.Center 
     layout(new Button() {text="button"}) = BorderPanel.Position.South 
    } 
    contents = new TabbedPane() { 
     pages += new TabbedPane.Page("Page", panel) 
    } 
    } 

    def createAndShowDialog = { 
    new FrameClearingDialog(top) 
    } 
} 

object Starter extends App { 
    val demo = new Parent 
    demo.main(args) 
} 
+0

私は私の問題を解決し、それはまだ問題がある理由を私は理解していません。私がタブ付きペインでページを呼び出せるように、私はページコンテンツであるパネルを使って地図を作った。私はこれをループし、ページにコンテンツをロードしました。これは動作しますが、ダイアログにアクセスするとコンテンツが失われます。 valに同じメソッドを使ってコンテンツを作成してからページとマップに入れるのはOKですが、マップはvarのままにしておきます。私はこの例を更新しましたが、やはりまだ動作しています。だから私はまだ本当の問題を見つけていない。 – Bday

+0

私はMainWindowでclose()してから、やっとopen()すると同じ問題が発生します。残念なことに、あなた自身の答えで示したように、唯一の回避策は、MainFrameコンストラクタ内のすべてのコンテンツを作成することです。 – Core

+0

MainFrameコンストラクタで見知らぬ人がいます...再オープン時に2回呼び出されます。 – Core

答えて

1

はこれが答えではないが、それは十分にそれを理解し、避けるために、問題を説明しません。

問題は有効範囲のようです。コンテンツがMainFrameコンストラクタの内部で作成された場合、それは子からの呼び出しで存続します。スウィングはときどき奇妙なことをしますが、私は今これにもっと時間を費やすつもりはありません。

"マップ"の作成をMainFrameに移すと、この例は正しく動作します。


package hack 

import scala.swing.{Action, BorderPanel, BoxPanel, Button, Dialog, Dimension, FlowPanel, Frame, MainFrame, Menu, MenuBar, MenuItem, Orientation, Panel, Point, RichWindow, SimpleSwingApplication, TabbedPane} 

/** 
    * Created by bday on 3/31/16.<br> 
    * <br> 
    * Utils will do something useful I'm sure 
    */ 
object Utils { 

    def findCenter(window: RichWindow) = { 
    new Point(window.location.x + window.size.width/2, window.location.y + window.size.height/2) 
    } 

    def centerMe(parent: RichWindow, child: RichWindow) = { 
    val parentCenter = findCenter(parent) 
    val childCenter = findCenter(child) 
    new Point(parentCenter.x - childCenter.x, parentCenter.y - childCenter.y) 
    } 
} 

/** 
    * Created by bday on 3/31/16.<br> 
    * <br> 
    * FrameClearingDialog will do something useful I'm sure 
    */ 
class FrameClearingDialog (parent: Frame) { 
    val dialog = new Dialog 
    dialog.contents = new FlowPanel() { 
    preferredSize = new Dimension(500, 500) 
    } 
    dialog.location = Utils.centerMe(parent, dialog) 
    dialog.open() 
} 

class Parent extends SimpleSwingApplication { 

    val map = { 
     var map = Map.empty[Int, Panel] 
     for (x <- 1 to 5) { 
     map += x -> createPanel(x) 
     } 
     map 
    } 

    override def top: Frame = new MainFrame { 
    title = "Hack " 
    preferredSize = new Dimension(1000,1000) 
    menuBar = new MenuBar() { 
     contents += new Menu("Menu") { 
     contents += new MenuItem(Action("Show Dialog") { 
      createAndShowDialog 
     }) 
     } 
    } 
    contents = new TabbedPane() { 
     for (x <- 1 to 5) { 
     pages += new TabbedPane.Page(s"Page $x", map(x)) 
     } 
    } 
    } 

    def createPanel(x: Int) = { 
    new BoxPanel(Orientation.Vertical) { 
     contents += new Button() {text=s"button $x"} 
    } 
    } 

    def createAndShowDialog = { 
    new FrameClearingDialog(top) 
    } 
} 

object Starter extends App { 
    val demo = new Parent 
    demo.main(args) 
} 
関連する問題