2012-04-11 1 views
1

У меня есть Gui, который позволяет пользователю нажимать кнопку и просматривать содержимое текстового файла. Проблема в том, что файл может быть довольно большим (100 000 + строк данных) и может занимать до 15 секунд для чтения и отображения в таблице.Как вы обновляете JDialog с новой информацией?

Пример формата текстового файла:

*/ 
    Account ID  : 8 digit number 
    Money Charged : Integer < $10 
    Values separated by \t 

/* 


Account Id Money Charged 
---------- -------------- 
731298  3 
359412  5 
624937  1 

Так что, когда кнопка нажата, она читает каждую строку и помещает каждый идентификатор в карту и увеличивает расходы по счетам.

Как только он будет закончен, он поместит JTable внутри JDialog с информацией. Однако, как только нажимается кнопка, пользователь может быть смущен в отношении того, что делает программа, поскольку я испытал до 10-15 секунд задержки до появления JDialog & JTable.

Итак, есть способ сделать JDialog появлением строки, позволяющей пользователю узнать, что она создает таблицу? (Я думал, что это будет сделано с помощью одного из методов, таких как JDialog repaint() или validate, но те, казалось, не сделать трюк

Вот порядок я думаю, это должно быть сделано:.

//Psuedo-code 
actionPerformed { 
    create frame 
    display label that lets user know its creating table 
    read text file 
    create map and place values 
    remove label 
    update dialog with table // unsure what to do to update it properly 
} 

Так что мой общий вопрос прост: можно ли информировать пользователя о том, что в настоящее время вычисления данных (с помощью JLabel в JDialog) и после того, как данные считываются, отображение JTable (по обновлению JDialog)?

При необходимости я могу предоставить источник. Не уверен, что это действительно необходимо, хотя

Редактировать

public void actionPerformed(ActionEvent event) { 
    JFrame frame = new JFrame(); 
    JDialog dialog = new JDialog(frame, "Account Charges", true); 
    JLabel label = new JLabel("Currently calculating the charges") 

    dialog.getContentPane().add(label);  //add waiting label 
    dialog.setVisible(true);    
    readData(myFile);       //read file and create table 
    dialog.getContentPane().remove(label); //waiting label no longer needed 
    dialog.getContentPane().add(myJtable); //update dialog with the table 
} 
+2

'При необходимости я могу предоставить источник. Не уверен, что это действительно необходимо, хотя ', да, точно, есть варианты, такие как звезды на небе, какой из них ваш, пожалуйста, отредактируйте свой вопрос с помощью [SSCCE] (http://sscce.org/) – mKorbel

+0

@mKorbel Я предположил, что кто-то попросите SSCCE, поэтому я добавил эту последнюю строку. Я все еще не думаю, что нужно ответить, можно ли обновить JDialog с новой информацией. Но я собрал простую программу, так что есть SSCCE – WilliamShatner

+0

до вас, конечно, вы не можете этого сделать, потому что вопрос очень хорошо описан :-) – mKorbel

ответ

5

1) I have a Gui which allows the user to click a button and view the contents of a text file.

  • использование CardLayout, я бы предложить создать другой контейнер, если вы на самом деле нужно, чтобы блокировать или предоставлять маску ввода для ввода/изменить/удалить значения, которые уже отображается или существуют

2) The issue is that the file can be rather large (100,000+ rows of data) and can take upwards of 15 seconds to read and display in a table.

  • Я не знаю ни одного человека, кроме внутренней ревизии, которые можно было бы хотеть проверить или работать с 100к строк используйте SwingWorker заполняет FileIO к TableModel, и создать вёрстка для JTable

3) // псевдопользователей-код

actionPerformed {

create frame - не JFrame re_use существующих JDialog, конечно лучше может быть CardLayout

display label that lets user know its creating table - понятия не пусть это будет

read text file - используйте SwingWorker с JProgressBar, чтобы преобразовать данные и поместить их в TableModel, используйте пакет для обновления TableModel f.e. каждый 50rows, искать вёрстка для JTable, то вы будете отображать только необходимые номера строк, а не 100к, это может быть сумасшедшим :-)

create map and place values - может быть бесполезным, потому что вы храните все необходимые данные в TableModel

remove label - понятия не пусть это будет

update dialog with table - JTable может быть обновлен мгновенную из SwinWorker, Качели GUI может быть подъезд для всех мышей или клавишных входов, никогда не ждут, ни задержки в 10-15sec

}

+0

. Я понимаю, почему вы хотели получить SSCCE сейчас. Я думаю, мы неправильно поняли друг друга. Важной частью того, что я хотел знать, было то, как добавить/удалить ярлык, когда таблица была заполнена, а затем добавить таблицу в диалог, а не там, где есть метка ожидания. (Я был в процессе создания SSCCE, когда вы отправили свой ответ) – WilliamShatner

+0

@WilliamShatner mKorbel правильно. Вы не должны блокировать пользовательский интерфейс в течение 15 секунд, создавая свою модель на EDT. Предложение «SwingWorker» очень актуально. Я даже не уверен, что вы можете гарантировать, что ваш 'JDialog' с ярлыком будет всегда нарисован, если вы сразу начнете декодировать свою модель на EDT после того, как вы измените диалог. И если вы хотите переключиться на нечто более динамичное, а затем на ярлык (например, индикатор выполнения или вращающийся значок), вам нужно освободить EDT для перерисовки. Итак, 'SwingWorker' - это способ пойти – Robin

+0

@Robin Я не имел в виду, что mKorbel был некорректным. Я просто хотел сказать, что мой вопрос касался только обновления информации, отображаемой в JDialog. (пользователь может закрыть его всякий раз, если он чувствует, что он слишком долго). mKorbel ответил на несколько вопросов, на которые я обязательно посмотрю и узнаю. Спасибо за совет от вас и mKorbel. Я все еще учусь и постоянно ищу, чтобы учиться у тех, кто уже завоевал простые проблемы с кодированием, такие как те, с которыми я сталкиваюсь ежедневно – WilliamShatner

4

JDialogs способны удерживать компоненты внутри них, такие как таблицы вы говорите. Вы можете просто указать пользователю, что вы делаете, используя метод JDialog's getContentPane для добавления/удаления таких компонентов, как индикатор выполнения и метка, чтобы они уведомлялись о том, что программа работает.

Кроме того, исправьте меня, если я ошибаюсь, но repaint() обычно является методом, используемым java.awt пакетами, и не так много javax.swing ... только в определенных случаях.

- Другое решение - Вы можете сообщить пользователю, что происходит, прежде чем диалог откроется. Возможно, в графическом интерфейсе или индикаторе выполнения есть метка «Текущий статус». Когда файл полностью прочитан и готов к использованию, вы можете открыть диалоговое окно и быстро опубликовать значения в таблице.

+0

Я добавил редактирование, чтобы показать, что я пытался использовать методом getContentPane(), но он показывает только метку? Нужно ли снова устанавливать диалоговое окно снова после создания таблицы? – WilliamShatner

+0

Кроме того, вы можете быть прав в отношении 'repaint()' Я просто смотрел на методы того, что может быть возможностью заставить его работать. Мне также нравится ваше альтернативное решение и будет иметь в виду, если я должен принять его до такой степени. – WilliamShatner

+0

'getContentPane(). Validate()' должен выполнять эту работу. Это всегда помогает взглянуть на Java API. Поскольку 'getContentPane()' возвращает 'Container', я посмотрел API для этого конкретного класса [здесь] (http://docs.oracle.com/javase/6/docs/api/java/awt/Container.html) –

2

Самый простой способ использовать ваше решение - сделать label.setVisible(false), когда ваша операция будет завершена. Разумеется, ваши планировщики (или, наоборот, хороший бесплатный дизайн) должны быть сделаны так, чтобы другие компоненты изменяли размер/правильность, когда этикетка становится невидимой. Обычно это должно происходить автоматически.

Будут другие способы сделать это, но вы потратите больше времени на их создание.

+0

Моя проблема в том, что он не добавляет JTable, когда он будет готов. Я добавил код в нижней части моего вопроса в качестве примера того, что я делаю. – WilliamShatner

+0

@WilliamShatner. О да, извините, я делаю приложение GUI с графическим дизайнером netbeans gui builder уже 2 недели, и я забыл, что есть другие вещи, чем это для gui -_- – MarioDS

 Смежные вопросы

  • Нет связанных вопросов^_^