Ich habe ein Problem mit der Anwendung (GUI JFrame Form Class), die ich erstellt habe, ich versuche, eine Methode auszuführen, die Befehle zum Durchführen von Datenscan mit java.util.TimerTask
enthält. Die Methode, die ich durchlaufen möchte JCheckBoxMenuItem
und wird ausgeführt, wenn ich checkBoxMenuItem
ankreuzen. Das Problem ist, dass, wenn ich "checkBoxMenuItem" check, die Scan-Methode noch läuft, aber ich kann nicht wieder auf JFrame (GUI) zugreifen.Ausführen von TimerTask hinter JFrame in Java
import Database.KoneksiDatabase2;
import Design.ClButtonTransparan;
import Design.JPanelWithImage;
import Proses.Data.DebitDiberikan;
import Proses.Data.DebitKebutuhan;
import Proses.Data.DebitTersedia;
import Proses.Data.AutoScanNReply;
import Proses.Data.CurahHujan;
import Proses.Data.DataKirim;
import Proses.Data.DataMasuk;
import Proses.Data.Faktor_K;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.util.Timer;
public class FormPAI extends javax.swing.JFrame {
private JPanel contentPane, panel1, panelJam;
private JLabel lbtotQs, lbtotQb, lbtotQa, lbfaktorK, lbQa1, lbQa2, lbQa3;
private JLabel lbQa4, lbQa5, lbQa6, lbQa7, lbQa8, lbQa9, lbQa10, lbQa11;
private JLabel lbQa12, lbQb1, lbQb2, lbQb3, lbQb4, lbQb5, lbQb6, lbQb7;
private JLabel lbQb8, lbQb9, lbQb10, lbQb11, lbQb12, lbTotQ;
private JButton btn1, btn2, btn3, btn4, btn5, btn6;
//public Timer timer2 = null;
private JPopupMenu popUp;
private JMenuItem tulisPesan, inbox, kotakKeluar, pesanTerkirim;
ActionListener aksi, aksiTulisPesan, aksiInbox, aksikotakKeluar, aksiPesanTerkirim;
private Timer timer;
public FormPAI() throws IOException, SQLException {
initComponents();
setTitle("Pembagian Air Irigasi");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 700, 650);
BufferedImage img = ImageIO.read(new File("C:\\Users\\X201\\Documents\\NetBeansProjects\\PembagianAirIrigasi\\src\\img\\bacground3.jpg"));
contentPane = new JPanelWithImage(img);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
setLocationRelativeTo(null);
btnClose();
BufferedImage imgSkema = ImageIO.read(new File("C:\\Users\\X201\\Documents\\NetBeansProjects\\PembagianAirIrigasi\\src\\img\\baturiti3.png"));
panel1 = new JPanelWithImage(resize(imgSkema, 670, 420));
panel1.setBorder(new LineBorder(new Color(0, 0, 0), 1, true));
panel1.setBounds(5, 115, 680, 425);
contentPane.add(panel1);
ClockLabel dateLable = new ClockLabel("date");
ClockLabel timeLable = new ClockLabel("time");
// ClockLabel dayLable = new ClockLabel("day");
panelJam = new JPanel();
panelJam.setBounds(545, 541, 140, 55);
panelJam.setBackground(Color.black);
panelJam.add(timeLable);
panelJam.add(dateLable);
// panelJam.add(dayLable);
contentPane.add(panelJam);
jCheckBoxMenuItem1.setText("Run Gammu");
jCheckBoxMenuItem1.setSelected(false);
jCheckBoxMenuItem1.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("Checked? " + jCheckBoxMenuItem1.isSelected());
int state = e.getStateChange();
if (state == ItemEvent.SELECTED){
try {
scan();
} catch (SQLException ex) {
Logger.getLogger(FormPAI.class.getName()).log(Level.SEVERE, null, ex);
}
}else{
timer.cancel();
}
}
});
}
public void scan() throws SQLException{
java.util.TimerTask task = new java.util.TimerTask() {
DebitKebutuhan dk = new DebitKebutuhan();
@Override
public void run(){
System.out.println("ajik");
DataMasuk obj = new DataMasuk();
DataKirim dkrm = new DataKirim();
CurahHujan ch = new CurahHujan();
String cek = null, processed="";
try {
Connection c = KoneksiDatabase2.getKoneksiDBSMS();
ResultSet rset = c.prepareStatement("SELECT * FROM inbox WHERE Processed='false'").executeQuery();
while (rset.next()){
cek = rset.getString("ID");
processed = rset.getString("Processed");
}
if (cek != null){
obj.ambilTeksPesan();
obj.cekFormatPesan();
if (obj.formatSMS == true && processed.equals("false")){
obj.ambilDataPesan();
obj.simpanPesan_ke_DB();
obj.sendToDataMasuk();
obj.updateDataMasuk();
ch.simpanCHKeDB();
dkrm.sendToOutbox();
obj.tandaiSudahDibalas(cek);
}
}
rset.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
timer = new Timer(true);// true to run timer as daemon thread
timer.schedule(task, 0, 5000);// Run task every 5 second
try {
Thread.sleep(60000*60); // Cancel task after 1 minute.
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
timer.cancel();
}
public static BufferedImage resize(BufferedImage img, int newW, int newH) {
Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = dimg.createGraphics();
g2d.drawImage(tmp, 0, 0, null);
g2d.dispose();
return dimg;
}
public final void btnClose(){
ImageIcon idt = new ImageIcon("C:\\Users\\X201\\Documents\\NetBeansProjects\\PembagianAirIrigasi\\src\\img\\exit.png");
Image imgRoll = idt.getImage();
Image newImgRoll = imgRoll.getScaledInstance(65, 65, 100);
ImageIcon icon = new ImageIcon("C:\\Users\\X201\\Documents\\NetBeansProjects\\PembagianAirIrigasi\\src\\img\\shutdown.png");
Image img = icon.getImage();
Image newimg = img.getScaledInstance(65, 65, 100);
btn6 = new ClButtonTransparan("<html><center>"+"KELUAR"+"</center></html>");
btn6.setFont(new Font("Berlin Sans FB Demi", Font.PLAIN,12));
btn6.setBounds(555, 5, 105, 105); // posisi jbutton (x, y) dan ukurunnnya (lebar, tinggi)
btn6.setIcon(new ImageIcon(newimg));
btn6.setRolloverIcon(new ImageIcon (newImgRoll));
btn6.setVerticalTextPosition(SwingConstants.BOTTOM); //membuat text jbutton berada dibawah
btn6.setHorizontalTextPosition(SwingConstants.CENTER); //membuat text jbutton berada ditengah
contentPane.add(btn6);
btn6.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//JOptionPane.showConfirmDialog(rootPane, menuBar);
System.exit(0);
}
});
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenu2 = new javax.swing.JMenu();
jCheckBoxMenuItem1 = new javax.swing.JCheckBoxMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jMenu1.setText("File");
jMenuBar1.add(jMenu1);
jMenu2.setText("Edit");
jCheckBoxMenuItem1.setSelected(true);
jCheckBoxMenuItem1.setText("jCheckBoxMenuItem1");
jCheckBoxMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jCheckBoxMenuItem1ActionPerformed(evt);
}
});
jMenu2.add(jCheckBoxMenuItem1);
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 279, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
private void jCheckBoxMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FormPAI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try{
FormPAI frame = new FormPAI();
frame.setVisible(true);
//frame.scan();
}catch(Exception e){
}
}
});
}
// Variables declaration - do not modify
private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem1;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
// End of variables declaration
}
class ClockLabel extends JLabel implements ActionListener {
String type;
SimpleDateFormat sdf;
public ClockLabel(String type) {
this.type = type;
setForeground(Color.green);
switch (type) {
case "day" : sdf = new SimpleDateFormat("EEEE ");
setFont(new Font("Digital-7", Font.PLAIN, 14));
setHorizontalAlignment(SwingConstants.RIGHT);
break;
case "time" : sdf = new SimpleDateFormat("hh:mm a");
setFont(new Font("sans-serif", Font.PLAIN, 16));
setHorizontalAlignment(SwingConstants.CENTER);
break;
case "date" : sdf = new SimpleDateFormat("dd MMMM yyyy");
setFont(new Font("sans-serif", Font.PLAIN, 20));
setHorizontalAlignment(SwingConstants.CENTER);
break;
default : sdf = new SimpleDateFormat();
break;
}
javax.swing.Timer t = new javax.swing.Timer(1000, this);
t.start();
}
@Override
public void actionPerformed(ActionEvent ae) {
Date d = new Date();
setText(sdf.format(d));
}
}
Ich glaube, es hat etwas damit zu tun, dass Sie 'Thread.sleep (60000 * 60) nennen;' das ist NICHT 1 Minute - es ist 1 Stunde ... Dies setzt die GUI in den Ruhezustand eine Stunde. Wenn Sie die Timer-Task nach einer Minute abbrechen möchten, sollten Sie nach einer Minute (1000 * 60) eine andere Timer-Task planen, die bei der ersten Timer-Task 'cancel' aufruft. Im Grunde genommen, dass Thread.sleep() OFF des UI-Threads! – pacifier21
Vielen Dank für Ihren Kommentar, eigentlich weiß ich bereits, was ich wirklich meine, ist, ob 'TimerTask' gleichzeitig mit der GUI laufen kann, ohne auf' TimerTask' zu warten. Wie "TimerTask" läuft hinter der GUI. Ist es in Java möglich? – adjieq