Baran Geschrieben 26. Juli 2004 Geschrieben 26. Juli 2004 Hallo! Ich möchte eine ProgressBar programmieren, die den Status versendeter Dateien anzeigt. Den Frame mit einem Label "Gesendet: " und einem Button "Abbrechen" habe ich. Eigentlich habe ich auch schon die ProgressBar, aber wenn ich das Programm starte öffnet sich die Bar in einem zweiten Frame. Wenn ich alles in ein Frame packe, sieht man erst nichts, ausser dem DOS-Fenster. Erst wenn es abgearbeitet ist erscheind es, und zeigt an wieviel Dateien versendet wurden. Im Quellcode ist noch nichts mit eingebunden, es geht erst mal darum dass die Bar läuft. Und was muss ich machen, dass das ganze im Hintergrund läuft, d.h. rechts unten in der Taskleiste? PS: ich weiss der Code ist ziemlich durcheinander, kommt vom vielen rumprobieren. // Datei Balken.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Balken { public static void main(String[] args) { new UserFrame(); } } class UserFrame extends JFrame implements ActionListener { int datnr; private JProgressBar bar; private JLabel status; private void place(Component comp, int x, int y, int width, int height) { comp.setBounds(x, y, width, height); add(comp); } public UserFrame() { getContentPane().setLayout(new FlowLayout()); // Titel festlegen setTitle("Sende Dateien"); // Groesse festlegen setSize(300, 100); //setLayout(null); // Hintergrundfarbe setBackground(Color.lightGray); final int max = 5; final JProgressBar bar = new JProgressBar(0, max); do { // Anzeige in Veränderung for (int i = 1; i <= max; i++) { try { Thread.sleep(10); } catch (InterruptedException e) { } final int j = i; SwingUtilities.invokeLater(new Runnable() { public void run() { bar.setValue(j); } }); } datnr++; } while (datnr < 50); status = new JLabel("Gesendet: " + datnr); status.setFont(new Font("Arial", Font.BOLD, 12)); status.setBackground(Color.lightGray); getContentPane().add(status); getContentPane().add(bar); //JFrame frame = new JFrame(); //frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); //frame.pack(); //frame.show(); JButton btn = new JButton("Abbrechen"); btn.setFont(new Font("Arial", Font.BOLD, 11)); btn.setBackground(new Color(200, 200, 200)); btn.addActionListener(this); getContentPane().add(btn); // sichtbar setVisible(true); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Abbrechen")) System.exit(0); } } Edit: Bitte code tags benutzen! Zitieren
etreu Geschrieben 26. Juli 2004 Geschrieben 26. Juli 2004 1. in deiner main: new UserFrame().start(); 2. in UserFrame: class UserFrame extends JFrame implements ActionListener, Runable 3. Zum Thema Tray-Icon wirds komplizierter. Da habe ich nur kommerzielle Lösungen für Windows gefunden. Gibts nicht standardmäßig von sun. Ein Link aus dem Java-Tutorial: http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html Zitieren
Peeter Geschrieben 26. Juli 2004 Geschrieben 26. Juli 2004 Schon mal dran gedacht, das dein do { // Anzeige in Veränderung for (int i = 1; i <= max; i++) { try { Thread.sleep(10); } catch (InterruptedException e) { } final int j = i; SwingUtilities.invokeLater(new Runnable() { public void run() { bar.setValue(j); } }); } datnr++; } while (datnr < 50); DIREKT bei der Erzeugung deines Frames abgearbeitet wird?! Jetzt überlege mal, ob das nicht vielleicht dein Fehler ist... ;-) Zitieren
Baran Geschrieben 26. Juli 2004 Autor Geschrieben 26. Juli 2004 @Enrico T.: 1. Wenn ich start() mit anhänge, muss ich doch eine Methode schreiben, die so heisst oder? Wenn ja, wie? 2. Und wenn ich Runnable anhänge kommt F:\Balken\Balken.java:19: UserFrame should be declared abstract; it does not define run() in UserFrame class UserFrame extends JFrame implements ActionListener, Runnable @Peeter: Ich hab die Schleife soweit oben geschrieben, weil sonst das Label "status" den Wert von der Variable datnr nicht übernimmt. Wenn es weiter unten steht, kommt nach der Ausführung immer "Gesendet: 0" obwohl es eben 50 sein müssten. Oder muss ich das Ganze als Funktion schreiben? Wenn ja wie? Zitieren
Peeter Geschrieben 26. Juli 2004 Geschrieben 26. Juli 2004 Vorneweg mal was. Beschäftige dich mal mit Threads und Interfaces... Nur ein gut gemeinter Rat. Wenn du Runnable implementierst MUSST du abstracte Methoden überschreiben. So, und nun zu deiner do-while-Schleife. Schreib das ganze als Methode und rufe das ganze in einem extra-Thread auf... Zitieren
etreu Geschrieben 26. Juli 2004 Geschrieben 26. Juli 2004 @Enrico T.: 1. Wenn ich start() mit anhänge, muss ich doch eine Methode schreiben, die so heisst oder? Wenn ja, wie? Nein. @Enrico T.: 2. Und wenn ich Runnable anhänge kommt F:\Balken\Balken.java:19: UserFrame should be declared abstract; it does not define run() in UserFrame class UserFrame extends JFrame implements ActionListener, Runnable Du must die Methode public void run() überschreiben. Da packst du dann deine Schleife rein. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.