Как запустить SimpleSwingApplication из основного метода консоли? - PullRequest
5 голосов
/ 26 октября 2011

Я написал свое первое консольное приложение в Scala и свое первое приложение Swing в Scala - в случае последнего точка входа - это метод top в моем объекте, расширяющий SimpleSwingApplication .

Однако я хотел бы все же пройти через метод main и оттуда вызвать top - или выполнить другие эквивалентные действия (например, создать окно и "запустить" его).

Как это сделать?

На всякий случай, если вам интересно, почему графический интерфейс является необязательным, поэтому я хотел бы проанализировать аргументы командной строки и затем принять решение показать (или нет) окно приложения.

Ответы [ 4 ]

4 голосов
/ 05 декабря 2012

Вот наиболее простой пример:

import swing._

object MainApplication {
  def main(args: Array[String]) = {
    GUI.main(args)
 }

  object GUI extends SimpleSwingApplication {
    def top = new MainFrame {
      title = "Hello, World!"
    }
  }
}

Выполните scala MainApplication.scala из командной строки, чтобы запустить приложение Swing.

4 голосов
/ 26 октября 2011

Если у вас есть что-то вроде:

object MySimpleApp extends SimpleSwingApplication {
  // ...
}

Вы можете просто позвонить MySimpleApp.main, чтобы запустить его из консоли. Метод main добавляется, когда вы смешиваете черту SimpleSwingApplication. Взгляните на scaladoc .

2 голосов
/ 30 августа 2012

Если вы переопределяете основной метод, который наследуете от SimpleSwingApplication, вы можете делать все, что захотите:

object ApplicationWithOptionalGUI extends SimpleSwingApplication {

  override def main(args: Array[String]) =
    if (parseCommandLine(args))
      super.main(args) // Starts GUI
    else
      runWithoutGUI(args)

...

}
0 голосов
/ 16 мая 2019

Мне нужно было использовать 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
  }
}

Но я думаю, что мне больше нравится первый метод, с разделенным основным объектом. Он имеет по крайней мере на один уровень отступ меньше, чем последний метод.

...