Мне нужно было использовать main.args в SimpleSwingApplication.Я хотел дать имя файла для обработки в качестве аргумента в CLI, или затем использовать JFileChooser в случае, если список аргументов командной строки был пуст.
Я не знаю, существует ли простой метод для использования командной строкиАргументы в SimpleSwingApplication , но я понял, как это работает, в demoapp.class:
class demoSSA(args: Array[String]) extends SimpleSwingApplication {
....
var filename: String = null
if (args.length > 0) {
filename = args(0)
} else {
// use JFileChooser to select filename to be processed
// https://stackoverflow.com/questions/23627894/scala-class-running-a-file-chooser
}
....
}
object demo {
def main(args: Array[String]): Unit = {
val demo = new demoSSA(args)
demo.startup(args)
}
}
Затем запустите приложение с помощью demo [args] , указав имя файлав качестве аргумента CLI или оставив его пустым, и программа использует JFileChooser, чтобы спросить его.
Есть ли способ получить аргументы main () в одноэлементном объекте SimpleSwingApplication? Поскольку он не 'не нужно разбирать имя файла в переопределенном SimpleSwingApplication.main и использовать имя файла в одноэлементном объекте, его необходимо объявить (val args: Array [String] = null;), а не просто определить (val args: Array [String];).И у одноэлементных объектов, унаследованных от SSA, не может быть параметров.
(Правка) Нашли еще один способ: если вся demoSSA помещается в переопределенные main () или startup (), то top MainFrame должен быть определен снаружи как top = nullи повторно объявите его из startup () как this.top:
object demo extends SimpleSwingApplication {
var top: MainFrame = null
override def startup(args: Array[String]) {
... // can use args here
this.top = new MainFrame {
... // can use args here also
};
val t = this.top
if (t.size == new Dimension(0,0)) t.pack()
t.visible = true
}
}
Но я думаю, что мне больше нравится первый метод, с разделенным основным объектом. Он имеет по крайней мере на один уровень отступ меньше, чем последний метод.