Как код графического интерфейса вызывается перед моим сканером?

У меня возникли проблемы с вводом данных из командной строки перед открытием окна графического интерфейса. Я задавал этот вопрос ранее на Apple Exchange, но был отправлен сюда после того, как мы определили, что это проблема программирования. По сути, я запускаю сканер, чтобы получить пользовательский ввод, прежде чем я открою окно, но он запускает программу, переключая пробелы на моем Mac, а затем мне приходится переключаться обратно в рабочее пространство с терминалом в нем, чтобы ответить на вопрос. Вот ссылка на исходный вопрос.

https://apple.stackexchange.com/questions/45058/lion-fullscreen-desktop-switching-quirk/45065#comment51527_45065

Вот код, который я тестировал...

public class Client extends JFrame {

  public static void main(String[]args) {
    Scanner in = new Scanner(System.in);
    System.out.printf("\nGive me a size for the screen: ");
    String response = in.nextLine();
    new Client(response);
  }

  public Client(String title) {
    super(title);
    super.setVisible(true);
  }

}

person CaldwellYSR    schedule 22.03.2012    source источник
comment
Объекты Swing GUI должны создаваться и управляться только на поток отправки событий.   -  person trashgod    schedule 23.03.2012


Ответы (2)


Используйте invokeLater(), чтобы запустить графический интерфейс после вы получаете ввод.

    final String response = in.nextLine();
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            new Client(response);
        }
    });

Обратите внимание, что ваш пример отлично работает на моей платформе из-за разницы во времени. Также рассмотрите возможность использования массива args для передачи параметров или спросите реализацию, как показано в FullScreenTest.

Приложение: прочитав вашу другую ветку чуть внимательнее, вы можете используйте следующий подход, который запускает NamedFrame в отдельной JVM.

package cli;

import java.awt.EventQueue;
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JFrame;

/** @see https://stackoverflow.com/q/9832252/230513 */
public class CommandLineClient {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Give me a name for the screen: ");
        final String response = in.nextLine();
        try {
            ProcessBuilder pb = new ProcessBuilder(
                "java", "-cp", "build/classes", "cli.NamedFrame", response);
            Process proc = pb.start();
        } catch (IOException ex) {
            ex.printStackTrace(System.err);
        }
    }
}

class NamedFrame extends JFrame {

    public NamedFrame(String title) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);
        setVisible(true);
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new NamedFrame(args[0]);
            }
        });
    }
}
person trashgod    schedule 23.03.2012
comment
Кажется, я во многом ошибался. Спасибо :) - person CaldwellYSR; 23.03.2012
comment
Рад помочь. Часть проблемы связана с Mac OS и рассматривается в другом потоке, но запуск новой JVM работает на разных платформах. См. также Launcher. - person trashgod; 23.03.2012

Код вроде в порядке. Есть ли в клиенте какие-либо вещи на уровне класса, которые вы здесь не показали (например, статические члены и т. д.?)

Все описание переключения рабочих пространств в вашей ссылке относится к уровню ОС, а не к Java.

Есть ли варианты для команды java или что-то на Mac, которое вы могли бы использовать?

person John3136    schedule 22.03.2012