" JOptionPane.QUE STION_ME S SAGE,
JOptionPane.YES_NO_CANCEL_OPTION, null, opts, opts[2]);
JDialog d = op.createDialog(this, " Собственное диалоговое окно"); d.setVisible(true);
Рис. 14.19. Собственное диалоговое окно |
Еще один вид диалоговых окон, предназначенный для слежения за протеканием какого-нибудь процесса, предоставляет класс ProgressMonitor. Окно этого класса показывает сообщение, индикатор-"градусник" — объект класса JProgressBar — и кнопки OK и Cancel.
Единственный конструктор класса
ProgressMonitor(Component parent, Object message, String note, int min, int max);
кроме ссылки parent на родительское окно, сообщения message, наименьшего min и наибольшего max значений "градусника" содержит параметр note. Это строка, значение которой можно менять во время ожидания методом setNote ( String).
Для смены значения индикатора выполняемый процесс должен обращаться к методу setProgress (int pos), задавая в нем текущее значение pos, лежащее между значением min и значением max. Это похоже на работу с классом JProgressBar, описанным в
В листинге 14.13 приведен пример использования окна индикатора. Для изменения значения индикатора запущен простейший подпроцесс. Рисунок 14.20 показывает вывод программы листинга 14.13.
import java.awt.*; import javax.swing.*;
public class Progress extends JFrame{
Progress(){
super(" Progress...");
final ProgressMonitor mon = new ProgressMonitor(this, "Идет процесс.", "Осталось ", 0, 100);
Runnable runnable = new Runnable(){
public void run(){
for (int i = 1; i < 100; i++){ try{
mon.setNote( "Осталось " + (100 — i) + " %"); mon.setProgress(i);
if (mon.isCanceled()){ mon.setProgress(100); break;
}
Thread.sleep(100);
}catch(InterruptedException e){}
}
mon.close();
}
};
Thread thread = new Thread(runnable); thread.start();
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT ON CLOSE); setVisible(true);
}
public static void main(String[] args){ new Progress();
}
}
Рис. 14.20. Окно индикатора |
Заключение
Вопросы для самопроверки
1. Что такое менеджер размещения?
2. Почему менеджеры размещения удобнее абсолютной расстановки компонентов?
3. В каких контейнерах можно установить менеджер размещения?
4. В каких компонентах можно установить менеджер размещения?
5. Почему менеджер размещения BorderLayout столь популярен?
6. Какой менеджер размещения установлен по умолчанию в окне класса JFrame?
7. Какой менеджер размещения установлен по умолчанию в классе JPanel?
8. Какой менеджер размещения установлен по умолчанию в классе JScrollPane?
9. Какой менеджер размещения установлен по умолчанию в классе JWindow?
10. Какой менеджер размещения установлен по умолчанию в классе JDialog?
11. Можно ли написать свой собственный менеджер размещения?
ГЛАВА 15