Zum Inhalt springen

ProgressBar


Baran

Empfohlene Beiträge

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! ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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... ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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... ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...