#java #swing #debugging #netbeans #timer
#java #swing #отладка #netbeans #таймер
Вопрос:
Не могли бы вы, пожалуйста, помочь мне с этим кодированием? Это таймер, который запускает определенную задачу, но она не останавливается! Я использую java.swing.Таймер и WebLookAndFeel (вы заметите NotificationManager: он принадлежит WebLaF). Я попытался вызвать <timer>.stop();
внутри себя, но затем он говорит, что его экземпляр не создан. Я также пробовал добавлять <timer>.setRepeats(false)
, что приводит к NPE. <timer>
относится к каждому уникальному таймеру.
Кодирование без таймеров работает отлично, но недавнее дополнение к приложению потребовало использования таймеров.
Я сам научился большинству из того, что использовал в своем программировании, поэтому я не очень хорош в отладке таймеров. Пожалуйста, потерпите меня.
Мой код:
Timer updateEB;
try {
updateEB = new Timer(2500, new ActionListener()
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("Update process started");
try {
// <editor-fold defaultstate="collapsed" desc="Get first message via SQL query">
try {
// Initiate SQL connection and execute query
String sql = "Select * from APP.EBULLETINS ORDER BY msgid DESC FETCH FIRST 2 ROWS ONLY";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection con = (Connection) DriverManager.getConnection("jdbc:derby:C:\Program Files\AmalgaIMS\AIMSDB", "xxxxxxx", "xxxxxxxx");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// Get message details
if (rs.next()) {
eBul1_Title = rs.getString("Title");
eBul1_Msg = rs.getString("Content");
eBul1_Type = rs.getString("MSGTYPE");
}
// Set message fields
eBul1T.setText(eBul1_Title);
eBul1M.setText(eBul1_Msg);
// Debugging purposes
System.out.println("Setting Icons...");
System.out.print("1. ");
// <editor-fold defaultstate="collapsed" desc="Set Message 1 Icon">
if (eBul1_Type.equals("INFORMATION")) {
TypeImage1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/Information.png")));
System.out.println("Info");
} else if (eBul1_Type.equals("ANNOUNCEMENT")) {
TypeImage1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/announcement.png")));
System.out.println("Announce");
} else if (eBul1_Type.equals("WARNING")) {
TypeImage1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/Warning.png")));
System.out.println("Warning");
} else {
TypeImage1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/misc 16x16.png")));
System.out.println("Other");
}
// </editor-fold>
} catch (Exception eB1Exc) {
JOptionPane.showMessageDialog(null, eB1Exc);
}
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Get second message via SQL query">
try {
// Initiate SQL connection and execute query
String sql = "Select * from app.EBULLETINS ORDER BY msgid DESC FETCH FIRST 2 ROWS ONLY";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection con = (Connection) DriverManager.getConnection("jdbc:derby:C:\Program Files\AmalgaIMS\AIMSDB", "xxxxxxxx", "xxxxxxxxx");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// Get message details
while (rs.next()) {
eBul2_Title = rs.getString("Title");
eBul2_Msg = rs.getString("Content");
eBul2_Type = rs.getString("MSGTYPE");
}
// Debugging purposes
System.out.print("2. ");
// Set message fields
eBul2T.setText(eBul2_Title);
eBul2M.setText(eBul2_Msg);
// <editor-fold defaultstate="collapsed" desc="Set Message 2 Icon">
if (eBul2_Type.equals("INFORMATION")) {
TypeImage2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/Information.png")));
System.out.println("Info");
} else if (eBul2_Type.equals("ANNOUNCEMENT")) {
TypeImage2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/announcement.png")));
System.out.println("Announce");
} else if (eBul2_Type.equals("WARNING")) {
TypeImage2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/Warning.png")));
System.out.println("Warning");
} else {
TypeImage2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/main/MainMenu/misc 16x16.png")));
System.out.println("Other");
}
// </editor-fold>
} catch (Exception eB2Exc) {
eB2Exc.printStackTrace();
}
// </editor-fold>
//<editor-fold defaultstate="collapsed" desc="Update Successful">
//<editor-fold defaultstate="collapsed" desc="Set eBulletin Notification Sound">
try {
// Open an audio input stream.
URL url = this.getClass().getResource("/Resources/Sounds/Notifications/NotifB.wav");
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
// Get a sound clip resource.
Clip clip = AudioSystem.getClip();
// Open audio clip from the audio input stream.
clip.open(audioIn);
clip.start();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
//</editor-fold>
NotificationManager.showNotification("eBulletins updated!", NotificationIcon.mail.getIcon());
Timer hideNotifs;
try {
hideNotifs = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
NotificationManager.hideAllNotifications();
}
});
hideNotifs.start();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception exc) {
exc.printStackTrace();
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Set Refresh Icon">
try {
lbleBulUpdate.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Resources/refresh 16x16.png")));
} catch (Exception e) {
System.out.println(e);
}
//</editor-fold>
lblEBulStatus.setForeground(new java.awt.Color(51, 255, 0));
lblEBulStatus.setText("ACTIVE");
}
});
updateEB.start();
} catch (Exception e) {
}
Ответ №1:
Вы выполняете много длительных вызовов в потоке отправки событий (или EDT), что делает его беспомощным. Вместо этого выполните код вашей базы данных и любой другой долго выполняющийся код в фоновом потоке, таком как доступный с помощью SwingWorker.
Кроме того, этот пустой блок catch меня пугает:
} catch (Exception e) {
}
Обратите внимание, если вы хотите, чтобы таймер запускался только один раз, вы можете отключить его в методе actionPerformed с помощью:
((Timer) evt.getSource()).stop();
Вы даже можете сделать это первой строкой вашего метода actionPerformed.
Комментарии:
1. Спасибо за совет. Я очистил блок catch в попытке сделать этот пост как можно короче, удалив бесполезную информацию. Ваш ответ помог, спасибо. Я только что внес обновление в ваш ответ, добавив () в evt.getSource