Подтвердить что ты не робот

Самый быстрый способ создать диалог сообщений Java (swing/awt/other)?

Я создаю приложение Java, которое будет выполнять некоторую обработку, тогда вам нужно будет отобразить сообщение, чтобы дать пользователю обратную связь.

Однако он кажется невероятно медленным - для возврата требуется более двух секунд.

Я отключил источник до очевидного виновника, и здесь используется код:

package SwingPlay;

import javax.swing.JFrame;

public class Dialog
{

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "DialogDemo" );
    }

}

Я выполняю это из командной строки с помощью

java -classpath . SwingPlay.Dialog

Как вы можете видеть - я ничего не делаю, кроме создания JFrame, даже не отображая его.

В случае, если это имеет значение, вот мой вывод java -version:

java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)

И это (в настоящее время) работает с Win XP SP2.


Итак, первый вопрос: почему это так медленно?

Что еще более важно, я просто хочу, чтобы простое сообщение (GUI, а не cmdline) отображалось без задержки - может ли кто-нибудь предоставить код для этого?


Update:

Может быть полезно немного фона:
Я создаю приложение, которое будет иметь множество "головок" (то есть различные пользовательские интерфейсы, которые используют одни и те же основные классы для выполнения сложных частей).
В настоящее время у меня есть чистая командная строка, которая отлично работает, - сразу отвечает.
У меня также будет стандартное приложение с обычной точкой и нажмите GUI и не предвидеть проблемы с этим битом.
В настоящее время я работаю над гибридом этих двух - он будет запущен из окна" Выполнить" (или аналогичной пусковой установки), возможно с аргументами, и должен отвечать только сообщение статуса, которое может быть уволены с помощью нажатия клавиши.

В этом последнем вопросе сосредоточен вопрос.

Хотя я не против использования моей существующей версии командной строки со сценариями оболочки (хотя и не думал, что это будет необходимо!), существующие ответы, похоже, предполагают, что все работает не так быстро для меня, как для другие - один пример занимает 1460 мс для меня, против 70 мс - значительная разница.

4b9b3361

Ответ 1

Причина задержки, потому что Java является интерпретируемым языком, и для запуска нового JVM (интерпретатора) требуется время

Фактически создание кадра занимает менее нескольких мс (около 70 мс на моей машине).

Если это будет использоваться в приложении Java, вам не нужно беспокоиться об этом. Это будет почти мгновенно (для этого вы должны использовать JDialog или JOptionPane)

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

Здесь, как я измеряю время в вашем коде:

import javax.swing.JFrame;

public class Dialog {

    public static void main( String[] args ) {
        long start = System.currentTimeMillis();
        JFrame frame = new JFrame( "DialogDemo" );
        System.out.println( "Took: " + (  System.currentTimeMillis() - start   ) );
    }

}

Ответ 2

Я бы использовал JOptionPane, чтобы показать сообщение. Вот простой пример:

import javax.swing.*;

public class OptionDemo {
    public static void main(String[] args) throws Exception {
        JOptionPane.showMessageDialog(null, "Hello World");
    }
}

Боюсь, я не могу объяснить задержку, которую вы испытываете. В моей системе ваш фрагмент кода работает в 500 миллисекунд.

Ответ 3

Java - неправильный инструмент для этого. Настройка JVM включает в себя много вещей, происходящих в фоновом режиме, прежде чем первая строка кода Java может быть выполнена, и нет никакого способа обойти ее.

Ответ 4

Также было бы намного быстрее создать AWT Window (или, возможно, Frame) вместо JFrame, потому что последний должен забрать газильон дополнительного файлы классов.

Ответ 5

НУЖНО использовать java для отображения окна сообщения? ЕСЛИ поле выходит извне вашего приложения, тогда вы можете использовать что-то еще для генерации диалога.

Чтобы создать собственное приложение для Windows, которое показывает только окно сообщения из строки командной строки, потребуется всего несколько часов. Большинство обычных языков сценариев должны иметь способы сделать это тоже. здесь пример от какого-то парня через javascript через командную строку:

http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html

Ответ 6

О, и если вам действительно не нужно показывать диалог с Java, вы можете изучить KDialog (или его аналог GNOME) или что-то подобное.

Ответ 7

Вы можете использовать JOptionDialog

JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);

Ответ 8

Поскольку вы заинтересованы в ускорении этого, и поскольку большая часть накладных расходов, по-видимому, является накладными расходами JVM, проверьте Nailgun который направлен на решение проблемы медленного запуска JVM, постоянно поддерживая JVM в фоновом режиме. В вашем случае, после одного запуска, библиотека Swing тоже закончится кэшированием (и, надеюсь, после еще нескольких запусков JITed), что еще больше сократит накладные расходы.

Однако этот подход приведет к увеличению использования памяти из-за фонового JVM, а также вызовет другие проблемы, поскольку может быть нелегко определить, когда его отключать.

Ответ 9

Что вы, вероятно, ищете, это новые функции SplashScreen в Java 6. Вместо того, чтобы ждать загрузки JVM (всегда стоит загрузить любую виртуальную машину), это предварительно загрузит экран.

Ответ 10

Вы пытались запустить его через профайлер, например NetBeans? Если есть узкое место внутри стандартной библиотеки, это хороший способ ее найти.