我不了解Java或Swing,但我对Scala非常熟悉,并且我将它用于我的目的没有任何问题.但是当我尝试实现GUI时,我遇到了许多文档无法轻易解决的问题/错误.我想scala.swing的例子可以帮助很多!
是否有任何使用scala.swing的小而不平凡且编写良好的应用程序,我可以从中学到什么?
我有一个流程布局的面板,它可以包含可变数量的项目 - 从1到2000.我想把它放在滚动窗格内,可以在垂直方向滚动,并具有固定的宽度.问题是,当我将面板的首选大小设置为类似(800,600)时,某些项目丢失,并且没有滚动.如果我设置滚动窗格的首选大小,则流窗格中的所有元素都会放在一个很长的行上.
在任何元素上设置最大大小似乎什么都不做 - 布局管理器忽略它.
我怎样才能解决这个问题?
在回答之前关于如何使用Swing实现某种效果的问题时,我被引导到JDesktopPane和JInternalFrame.不幸的是,scala.swing似乎没有任何一个类的包装器,所以我留下来扩展它.
我需要知道和做些什么才能为这些类创建最低限度可用的包装器,与scala.swing一起使用,以及制作大多数这些类的附加步骤是什么?
编辑:
正如某人所建议的,让我解释一下我打算实现的效果.我的程序控制(个人)彩票投注.所以我有很多不同的门票,每张门票可以有不同的赌注和不同的有效性.
这个想法是在一个单独的"空间"中显示每个票证,JInternalFrames似乎正是我想要的,让人们创建新票证,从文件加载它们,将它们保存到文件,以及通常检查或编辑信息每个.
除此之外,还需要有一个空间来显示彩票结果,我打算进一步发展该计划,以便能够控制集体投注 - 谁贡献了多少,以及如何分配任何获胜.我还没有考虑过这个界面.
请注意:
我不能"只使用"Java类,仍然可以充分利用Scala swing功能.上一个问题的答案已经告诉我如何用Java类做我想做的事情,这不是我在这里要求的.
阅读现有scala.swing类的源代码以了解如何做到这一点是我试图通过这个问题避免的工作.
import swing._
object PeerTest extends SimpleSwingApplication {
def top = new MainFrame {
val p = peer.getMousePosition
}
}
Run Code Online (Sandbox Code Playgroud)
给
error: ambiguous reference to overloaded definition,
both method getMousePosition in class Container of type (x$1: Boolean)java.awt.Point
and method getMousePosition in class Component of type ()java.awt.Point
match expected type ?
val p = peer.getMousePosition
Run Code Online (Sandbox Code Playgroud)
但添加类型
val p: Point = peer.getMousePosition
Run Code Online (Sandbox Code Playgroud)
没事.为什么?
编辑:导致问题:
class A {
def value() = 123
}
class B extends A {
def value(b: Boolean) = 42 …Run Code Online (Sandbox Code Playgroud) 我试图抓住一个鼠标点击即可Table(这应该会导致弹出窗口显示).桌子位于a ScrollPane里面(反过来)Panel.我已经添加了对所有类的反应,但我似乎永远不会真正得到一个点击事件被捕获!
class MyPanel extends GridBagPanel {
val gbc = new GridBagContraints( ... )
add(new ScrollPane {
reactions += {
case MouseClicked(src, point, mod, clicks, pops) =>
println("Scroll pops: " + pops)
}
viewportView = new Table {
reactions += {
case MouseClicked(src, point, mod, clicks, pops) =>
println("Table pops: " + pops)
}
...
}
}, gbc)
reactions += {
case MouseClicked(src, point, mod, clicks, pops) =>
println("Panel pops: " + pops)
}
} …Run Code Online (Sandbox Code Playgroud) 我想使用setComponentPopupMenu().但是Scala.Swing.Component似乎没有所有JComponent方法,尽管文档中引用了javax.swing.JComponent.所以我有点困惑.
我正在尝试为应用程序创建一个登录窗口.我整天都在寻找一个例子,但我似乎无法找到任何有用的东西.我的基本结构如下:
// App.scala
object App extends SimpleSwingApplication {
val ui = new BorderPanel {
//content
}
def top = new MainFrame {
title = "title"
contents = ui
}
}
Run Code Online (Sandbox Code Playgroud)
那么,在登录和显示大型机之后,创建一个没有大型机显示和关闭它的登录框的策略是什么.谢谢
我正在学习如何使用 Scala 上的标准 Swing 小部件构建 GUI。这就是我想做的:

我成功地创建了组件,但未能对齐它。我的所有组件都居中对齐,不像我想要的那样(Button1 在左侧,table 在中心,button2 在右侧)。我也找不到太多关于 Scala 的 Swing 的信息。大多数搜索结果都是关于Java的(我对此一无所知)。我应该做什么来强制对齐?
这是代码:
ontents += new BoxPanel(Orientation.Vertical) {
contents += new Button("Button 1")
contents += new Table(3, 3)
contents += new Button("Button 2")
}
Run Code Online (Sandbox Code Playgroud)
结果:

先谢谢了。
我尝试使用三个组合框来实现日期选择,如下所示。
contents += new Label("Selected Date:")
val dayBox = new ComboBox(1 to 31)
contents += dayBox
val monthBox = new ComboBox(List("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
contents += monthBox
listenTo(monthBox.selection)
reactions += {
case SelectionChanged(`monthBox`) => Dialog.showMessage(ui, "Month changed.")
}
contents += new ComboBox(2011 to 2020)
Run Code Online (Sandbox Code Playgroud)
当我更改monthBox时,如何更改dayBox中的项目?我知道 Dialog.showMessage 部分应该更改。但我想知道如何?
例如,当我更改为 Jan、Mar、May、Jul、Aug、Oct、Dec 时,该日期应显示 31,而除了 2 月的 28 之外,其他日期应显示 30。
我在关闭我的Scala摆动框架时遇到了问题.这是我的退出按钮的代码
val buttonExit = new Button {
text = "Exit"
action = Action("Exit") {
WorldActor.run(false)
closer
}
}
Run Code Online (Sandbox Code Playgroud)
close函数定义为:
def closer (){
top.close
}
Run Code Online (Sandbox Code Playgroud)
top是MainFrame.每次我试图关闭,它只是暂停并停止响应.
scala swing看起来很有趣,但不知何故它是不完整的,有时我仍然需要使用旧的java类,但我不知道如何正确地包装它们.
那么如何正确包装javax.swing.JInternalFrame以便我可以在MainFrame中将它用作Component?
我试着让这个例子与scala和scala swing库一起工作,我终于设法获得了一个内部框架,但我的MainFrame扭曲了所有内部框架并将它们拉伸直到它们具有与内部空间完全相同的宽度和高度.主机上.
这是我目前的实施:
import swing._
import event._
object InternalFrameDemo extends SimpleSwingApplication{
val top = new MainFrame{
title = "InternalFrameDemo"
preferredSize = new Dimension(640,480)
val menuNew = new MenuItem("New"){
mnemonic = Key.N
action = new Action("new"){
def apply(){
createFrame
}
}
}
val menuQuit = new MenuItem("Quit"){
mnemonic = Key.Q
action = new Action("quit"){
def apply(){
quit()
}
}
}
menuBar = new MenuBar{
contents += new Menu("Document"){
mnemonic = Key.D
contents ++= Seq(menuNew,menuQuit)
}
} …Run Code Online (Sandbox Code Playgroud)