Hallöle,
wie der Titel schon sagt verursacht bei mir ein Countdown den ich über ein JLabel laufen lasse ein Speicher Leak und ich bin ratlos wie jenes beheben soll.
Der Countdown wird mit dem Timer von javax.swing realisiert.
Zum Quellcode:
Der Leak ist zwar nur gering(4-12 K/sec) doch wenn ich den Countdown eine Stunde lang oder mehr(was vorkommen kann) ausführe würde sich der Ram ziehmlich zusetzen.
Ich hoffe mir kann jemand meinem Fehler zeigen oder mir eine Alternative nennen.
Gruß Negi
PS:
Ach und ein nettes Hallo meinerseits. Bin neu hier, habe aber schon des öfteren Beiträge hier gelesen.
Ich Studiere Informatik und bin im 3 Semester. Ausserdem Arbeite ich für einen Professor meiner Uni als Studentische hilfskraft und Programmiere dort in Java für eine Projecktarbeit. Mein Wissensstand in Java ist daher doch schon über dem eines Anfängers. Wenn auch noch nicht so das ich sagen würde ich habe Java Erfunden xD
wie der Titel schon sagt verursacht bei mir ein Countdown den ich über ein JLabel laufen lasse ein Speicher Leak und ich bin ratlos wie jenes beheben soll.
Der Countdown wird mit dem Timer von javax.swing realisiert.
Zum Quellcode:
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package shutdown;
/**
*
* @author IP-Error
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ShutdownMain extends JFrame implements ActionListener{
/**
* @param args the command line arguments
*/
private JLabel text, Stunde, Minuten,countdown;
private JRadioButton shutdown, hold, restart;
private ButtonGroup gruppe;
private JComboBox Std, Min;
private JButton run, abort;
private String[] std, min;
int stunde=1 , minute=0;
long wait, time_left;
private String todo="s";
private Action a;
private Timer Countdown;
private final ActionListener taskPerformer;
private long h,mins,sec;
public ShutdownMain() throws Exception{
final Container container = getContentPane();
setLayout(null);
setTitle("Shutdown");
//initialisiern der zeit arrays
std= new String[24];
min= new String[60];
for(int i=0; i<24; i++){
std[i]=""+i;
}
for(int i=0; i<60; i++){
min[i]=""+i;
}
countdown=new JLabel("00:00:00");
countdown.setBounds(250, 50, 75, 25);
container.add(countdown);
taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
time_left -= 40;
h= time_left/3600000;
mins= (time_left-h*3600000)/60000;
sec= ((time_left-h*3600000)-mins*60000)/1000;
countdown.setText(h+":"+mins+":"+sec);
}
};
Countdown = new Timer(40,taskPerformer);
text = new JLabel();
text.setBounds(0, 170, 380, 25);
container.add(text);
Stunde = new JLabel("Stunden:");
Stunde.setBounds(110, 0, 50, 25);
container.add(Stunde);
Std = new JComboBox(std);
Std.setSelectedIndex(1);
Std.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
stunde= Std.getSelectedIndex();
}
});
Std.setBounds(175, 0, 50, 20);
Std.setBackground(Color.white);
container.add(Std);
Minuten = new JLabel("Minuten:");
Minuten.setBounds(250, 0, 50, 25);
container.add(Minuten);
Min = new JComboBox(min);
Min.setSelectedIndex(0);
Min.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
minute=Min.getSelectedIndex();
}
});
Min.setBounds(315, 0, 50, 20);
Min.setBackground(Color.white);
container.add(Min);
shutdown=new JRadioButton("Herunterfahren");
shutdown.setActionCommand("s");
shutdown.setBounds(0,45,200,25);
//shutdown.setBackground(new Color(82,244,106));
restart = new JRadioButton("Neustart");
restart.setActionCommand("r");
restart.setBounds(0, 90, 200, 25);
//restart.setBackground(new Color(82,244,106));
hold = new JRadioButton("Ruhezustand");
hold.setActionCommand("h");
hold.setBounds(0,135,200,25);
//hold.setBackground(new Color(82,244,106));
shutdown.addActionListener(this);
restart.addActionListener(this);
hold.addActionListener(this);
gruppe= new ButtonGroup();
gruppe.add(shutdown);
gruppe.add(restart);
gruppe.add(hold);
shutdown.setSelected(true);
container.add(shutdown);
container.add(restart);
container.add(hold);
run = new JButton("Starten");
run.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
wait= stunde*3600000+minute*60000;
time_left = wait;
abort.setVisible(true);
run.setVisible(false);
if(todo.equals("s")){
text.setText("Das System wird in "+stunde+" Stunden und "+minute+" Minute ausgeschaltet.");
a = new Action(todo+" -t 0", wait);
Countdown.start();
}
else{
if(todo.equals("r")){
text.setText("Das System wird in "+stunde+" Stunden und "+minute+" Minuten Neugestartet.");
a = new Action(todo+" -t 0", wait);
Countdown.start();
}
else{
if(todo.equals("h")){
text.setText("Das System wird in "+stunde+" Stunden und "+minute+" Minuten ausgeschaltet.");
a = new Action(todo, wait);
Countdown.start();
}
}
}
}
});
run.setBounds(50, 215, 100, 35);
container.add(run);
abort = new JButton("Abbrechen");
abort.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
a.abort();
run.setVisible(true);
abort.setVisible(false);
Countdown.stop();
text.setText("Aktion Abgebrochen!");
}
});
abort.setBounds(200,215,100,35);
abort.setVisible(false);
container.add(abort);
pack();
setSize(400,300);
setVisible(true);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
todo= e.getActionCommand();
}
public static void main(String[] args) throws Exception{
// TODO code application logic here
new ShutdownMain();
}
}
Der Leak ist zwar nur gering(4-12 K/sec) doch wenn ich den Countdown eine Stunde lang oder mehr(was vorkommen kann) ausführe würde sich der Ram ziehmlich zusetzen.
Ich hoffe mir kann jemand meinem Fehler zeigen oder mir eine Alternative nennen.
Gruß Negi
PS:
Ach und ein nettes Hallo meinerseits. Bin neu hier, habe aber schon des öfteren Beiträge hier gelesen.
Ich Studiere Informatik und bin im 3 Semester. Ausserdem Arbeite ich für einen Professor meiner Uni als Studentische hilfskraft und Programmiere dort in Java für eine Projecktarbeit. Mein Wissensstand in Java ist daher doch schon über dem eines Anfängers. Wenn auch noch nicht so das ich sagen würde ich habe Java Erfunden xD
Zuletzt bearbeitet: