Два вопроса по использованию Window Listeners в Java Swing Desktop
**** Обратите внимание, что мой вопрос касается ответов в другой ветке. Однако, когда я разместил вопрос в этой теме, он был удален. Итак, я публикую здесь вопрос (со ссылкой на тот пост, на который я ссылаюсь). ****
У меня есть пара вопросов, которые идут вместе с этой веткой. Если у меня есть таймер (updateTimer), который я хочу отменить при закрытии окна, могу ли я поместить его вместо System.out.println("Закрытие Windows"); заявление? Или я должен был бы поместить его в фактический класс "View" (у меня есть три класса DesktopApplication.App, DesktopApplication.View и DesktopApplication.AboutBox, а метод настройки Window находится в классе.App).
В том же духе, если я могу поставить updateTimer.cancel(); в строке, значит ли это, что я могу читать / писать из файла, а также заполнять текстовые поля (событие WindowOpen) и записывать информацию в файл в событии закрытия?
Я хочу сделать следующее: когда мое приложение запускается (и открывается главное окно), я хочу проверить файл конфигурации. Если он существует, то я хочу получить имя пользователя, пароль, идентификатор туннеля и IP-адрес из этого файла - и заполнить их соответствующие текстовые поля в главной jPanel. Если этого не будет, то я ничего с этим не сделаю.
При закрытии приложения я хочу, чтобы произошли две вещи: 1) все запущенные UpdateTimers будут отменены (чтобы эффективно и аккуратно закрыть приложение) и 2) записать имя пользователя, пароль, идентификатор туннеля и IP-адрес в файл конфигурации для следующий прогон
Я создал файл в Netbeans, поэтому автоматически генерируется "exitMenu", а "кнопка закрытия" не настроена. Поэтому мне нужно использовать WindowClosing для этого (или взломать метод exitMenu в текстовом редакторе и надеяться, что он не создаст проблем с Netbeans).
Я также должен добавить, что имя пользователя и пароль на самом деле являются MD5-хешами реального имени пользователя и пароля. Таким образом, хотя кто-то может открыть текстовый файл и прочитать его, он увидит только что-то вроде этого:
c28de38997efb893872d893982ac 3289ab83ce8f398289d938999cab 12345 192.168.2.2
Спасибо и хорошего дня:)
Патрик. Отредактировано, чтобы включить информацию о "имени пользователя и пароле", которая будет сохранена.
2 ответа
могу ли я поместить это вместо System.out.println("Закрытие Windows"); заявление?
Да, вы можете поместить произвольный код в ваш слушатель
В том же духе, если я могу поставить updateTimer.cancel(); в строке, значит ли это, что я могу читать / писать из файла, а также заполнять текстовые поля (событие WindowOpen) и записывать информацию в файл в событии закрытия?
да
Как я это сделал, вот так.
В моем классе "TunnelbrokerUpdateView" (тот, который фактически обрабатывает основной кадр), я добавил следующий код:
WindowListener wl = new WindowListener(){
public void windowOpened(WindowEvent e)
{
try
{
FileReader fr = new FileReader (new File("userinfo.txt"));
BufferedReader br = new BufferedReader (fr);
jTextField1.setText(br.readLine());
jPasswordField1.setText(br.readLine());
jTextField2.setText(br.readLine());
oldIPAddress = br.readLine();
br.close();
}
catch (FileNotFoundException ex) {
// Pop up a dialog box explaining that this information will be saved
// and propogated in the future.. "First time running this?"
int result = JOptionPane.showConfirmDialog((Component)
null, "After you enter your user information, this box will no longer show.", "First Run", JOptionPane.DEFAULT_OPTION);
}
catch (java.io.IOException ea)
{
Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ea);
}
}
public void windowClosing(WindowEvent e) {
updateTimer.cancel();
BufferedWriter userData;
//Handle saving the user information to a file "userinfo.txt"
try
{
userData = new BufferedWriter(new FileWriter("userinfo.txt"));
StringBuffer sb = new StringBuffer();
sb.append(jTextField1.getText());
sb.append(System.getProperty("line.separator"));
sb.append(jPasswordField1.getText());
sb.append(System.getProperty("line.separator"));
sb.append(jTextField2.getText());
sb.append(System.getProperty("line.separator"));
sb.append(oldIPAddress);
userData.write(sb.toString());
userData.close();
}
catch (java.io.IOException ex)
{
Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void windowClosed(WindowEvent e) {
System.exit(0);
}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
};
super.getFrame().addWindowListener(wl);
}
Я добавил это в метод "public TunnelbrokerUpdateView(приложение SingleFrameApplication)". Итак, все работает так, как я хотел. Я уверен, что есть лучшие способы включения пользовательской информации, но это было быстро и грязно. В будущем я планирую зашифровать данные (или преобразовать их в формат, который обычно не читается), поскольку в этом случае используется хэш пароля.
Надеюсь, это поможет кому-то еще в будущем.
(для справки, вот весь метод (включая материал, который автоматически добавляется Netbeans)
public TunnelbrokerUpdateView(SingleFrameApplication app) {
super(app);
initComponents();
// status bar initialization - message timeout, idle icon and busy animation, etc
ResourceMap resourceMap = getResourceMap();
int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout, new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusMessageLabel.setText("");
}
});
messageTimer.setRepeats(false);
int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++) {
busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
}
busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
public void actionPerformed(ActionEvent e) {
busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
}
});
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
// connecting action tasks to status bar via TaskMonitor
TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
if ("started".equals(propertyName)) {
if (!busyIconTimer.isRunning()) {
statusAnimationLabel.setIcon(busyIcons[0]);
busyIconIndex = 0;
busyIconTimer.start();
}
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
} else if ("done".equals(propertyName)) {
busyIconTimer.stop();
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
progressBar.setValue(0);
} else if ("message".equals(propertyName)) {
String text = (String)(evt.getNewValue());
statusMessageLabel.setText((text == null) ? "" : text);
messageTimer.restart();
} else if ("progress".equals(propertyName)) {
int value = (Integer)(evt.getNewValue());
progressBar.setVisible(true);
progressBar.setIndeterminate(false);
progressBar.setValue(value);
}
}
});
// This will take care of Opening and Closing
WindowListener wl = new WindowListener(){
public void windowOpened(WindowEvent e)
{
try
{
FileReader fr = new FileReader (new File("userinfo.txt"));
BufferedReader br = new BufferedReader (fr);
jTextField1.setText(br.readLine());
jPasswordField1.setText(br.readLine());
jTextField2.setText(br.readLine());
oldIPAddress = br.readLine();
br.close();
}
catch (FileNotFoundException ex) {
// Pop up a dialog box explaining that this information will be saved
// and propogated in the future.. "First time running this?"
int result = JOptionPane.showConfirmDialog((Component)
null, "After you enter your user information, this box will no longer show.", "First Run", JOptionPane.DEFAULT_OPTION);
}
catch (java.io.IOException ea)
{
Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ea);
}
}
public void windowClosing(WindowEvent e) {
updateTimer.cancel();
BufferedWriter userData;
//Handle saving the user information to a file "userinfo.txt"
try
{
userData = new BufferedWriter(new FileWriter("userinfo.txt"));
StringBuffer sb = new StringBuffer();
sb.append(jTextField1.getText());
sb.append(System.getProperty("line.separator"));
sb.append(jPasswordField1.getText());
sb.append(System.getProperty("line.separator"));
sb.append(jTextField2.getText());
sb.append(System.getProperty("line.separator"));
sb.append(oldIPAddress);
userData.write(sb.toString());
userData.close();
}
catch (java.io.IOException ex)
{
Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void windowClosed(WindowEvent e) {
System.exit(0);
}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
};
super.getFrame().addWindowListener(wl);
}
Хорошего дня:) Патрик.