JPanel zeichnen

  • Themenstarter Themenstarter NurSo
  • Beginndatum Beginndatum
N

NurSo

Gast
Hallo leute

Ich habe ein kleines problem und bin mir sicher ihr könnt mir dabei helfen!
Es geht nämlich darum das ich in einem Panel Zeichne, sprich ein Fortschrittsbalken.
Und ich ein Thread wo ich gerne den Fortschrittsbalken prozentuell zeichnen möchte.

Das habe ich bisher:

Java:
class FortschrittsBalken extends JPanel
{
    public FortschrittsBalken() {
            this.setPreferredSize(new Dimension(100, 100));
            this.setBorder(BorderFactory.createLoweredBevelBorder());
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.red);
            g.drawOval(18, 0, 0, 100);
        }
}

...

int prozent = 0;
public void run()
    {

        while(!fertig)
        {
            try
            {
                Thread.sleep(10000);
                 prozent++;
                prozentuelleRechnung();

            }
            catch(InterruptedException ex)
            {
                ex.printStackTrace();
            }
        }
    }

public void prozentuelleRechnung()
{
      // Hier möchte hier gerne dann die Methode paintComponent() aufrufen damit er zeichnet aber
      // das soll im zusammen hang mit dem Wert prozent geschehen!


      fortschrittsbalkenPanel .... ??? 
      // Denke eine Schleife wäre Sinnvoll , die in die paintComponent() packen oder in dieser Methode?

}

Wie stelle ich es an in der Methode prozentuelleRechnung() mein Panel zu zeichnen??
 
du bräuchtest in deinem fortschrittsbalken noch ne variable progress und ne methode setProgress über die du dann immer den fortschritt updaten kannst. Wenn setProgress aufgerufen wird musst sich das panel neuzeichnen und zeichnet den balken eben entsprechend des wertes der in progress steht.

Warum nimmst du nicht den fertigen Fortschrittsbalken aus java? (JProgressBar)
 
Danke schonmal ,

kenne den JProgressBar und hatten den in anderen Projekten schon verwendet.
Und wollte einfach mal mit Panelzeichnen ausprobieren .

Dann müsste es in etwa so ausschauen:

Java:
class FortschrittsBalken extends JPanel
{
    private int summe;
    public FortschrittsBalken() {
            this.setPreferredSize(new Dimension(100, 100));
            this.setBorder(BorderFactory.createLoweredBevelBorder());
        }

        public void setProzent(int summe)
        {
            this.summe = summe;
            paintComponent( ??? ); // Was kommt hier rein??? new Graphics() geht nicht da abstract!
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.red);
            g.drawOval(summe, 0, 0, 100);
        }
}

public void prozentuelleRechnung()
{
      fortschrittsbalkenPanel.set.Prozent( prozent );
}
 
du rufst
Code:
repaint()
auf wenn du das Panel neuzeichnen willst, dann wird automatisch deine paintComponent Methode ausgeführt.

EDIT:
z.b.:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class ProgressPanel extends JComponent {
    private double progress = 0;

    public void setProgress(double progress) {
        if (progress < 0.0 || progress > 100.0) {
            throw new IllegalArgumentException("progress must be between 0.0 and 100.0");
        }
        this.progress = progress;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(Color.red);
        g2d.fillRect(0, 0, (int)((getWidth() / 100.0) * progress), getHeight());

        g2d.setColor(Color.BLACK);
        g2d.drawString(progress + "%", (getWidth() / 2) - 20, (getHeight() / 2) + 5);
    }

    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame();

        frame.setLayout(new BorderLayout());

        ProgressPanel panel = new ProgressPanel();

        panel.setPreferredSize(new Dimension(300, 50));

        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        double prog = 0;
        while (true) {
            Thread.sleep(1000);
            prog += 5;
            panel.setProgress(prog);
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben