Circular Progress Bar für Java-Swing nicht funktioniert

habe ich entdeckt, das test-Projekt von Oracle-Website, denn ich möchte hinzufügen, eine kreisförmige Fortschrittsbalken in mein Projekt.

Entwickle ich die Anwendung mit Netbeans, und wenn ich die Anwendung starten, wird das JPanel, wo der Kreis sein soll.... disappaer.

Habe ich entfernt den code, der nicht nützlich ist, dieses problem zu lösen und ich habe diesen code:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import javax.swing.*;
import javax.swing.plaf.LayerUI;


public class Loading_Test extends javax.swing.JFrame
{
    static final WaitLayerUI layerUI = new WaitLayerUI();
    public Loading_Test()
    {

        JPanel panel = new JPanel();
        JLayer<JPanel> jlayer = new JLayer<>(panel, layerUI);
        add(jlayer);

        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        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, 300, Short.MAX_VALUE)
        );

        pack();
    }

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {

            @Override
            public void run()
            {                
                JFrame frame = new Loading_Test();
                frame.setVisible(true);
                layerUI.start();
            }
        });
    }
}
class WaitLayerUI extends LayerUI<JPanel> implements ActionListener
{

    private boolean mIsRunning;
    private boolean mIsFadingOut;
    private Timer mTimer;
    private int mAngle;
    private int mFadeCount;
    private int mFadeLimit = 15;

    @Override
    public void paint(Graphics g, JComponent c)
    {
        int w = c.getWidth();
        int h = c.getHeight();

        //Paint the view.
        super.paint(g, c);

        if (!mIsRunning)
        {
            return;
        }

        Graphics2D g2 = (Graphics2D) g.create();

        float fade = (float) mFadeCount / (float) mFadeLimit;
        //Gray it out.
        Composite urComposite = g2.getComposite();
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f * fade));
        g2.fillRect(0, 0, w, h);
        g2.setComposite(urComposite);

        //Paint the wait indicator.
        int s = Math.min(w, h) / 5;
        int cx = w / 2;
        int cy = h / 2;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(s / 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g2.setPaint(Color.white);
        g2.rotate(Math.PI * mAngle / 180, cx, cy);
        for (int i = 0; i < 12; i++)
        {
            float scale = (11.0f - (float) i) / 11.0f;
            g2.drawLine(cx + s, cy, cx + s * 2, cy);
            g2.rotate(-Math.PI / 6, cx, cy);
            g2.setComposite(AlphaComposite.getInstance(
                    AlphaComposite.SRC_OVER, scale * fade));
        }

        g2.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (mIsRunning)
        {
            firePropertyChange("tick", 0, 1);
            mAngle += 3;
            if (mAngle >= 360)
            {
                mAngle = 0;
            }
            if (mIsFadingOut)
            {
                if (--mFadeCount == 0)
                {
                    mIsRunning = false;
                    mTimer.stop();
                }
            }
            else if (mFadeCount < mFadeLimit)
            {
                mFadeCount++;
            }
        }
    }

    public void start()
    {
        if (mIsRunning)
        {
            return;
        }

        //Run a thread for animation.
        mIsRunning = true;
        mIsFadingOut = false;
        mFadeCount = 0;
        int fps = 24;
        int tick = 1000 / fps;
        mTimer = new Timer(tick, this);
        mTimer.start();
    }

    public void stop()
    {
        mIsFadingOut = true;
    }

    @Override
    public void applyPropertyChange(PropertyChangeEvent pce, JLayer l)
    {
        if ("tick".equals(pce.getPropertyName()))
        {
            l.repaint();
        }
    }
}

Wenn Sie diesen code ausführen, sollten Sie das gleiche mein problem, das JPanel wird nicht angezeigt.

Aber ich habe entdeckt, dass, wenn ich entfernen Sie die layout-bezogene Linien (27~36) der Fortschritt-bar zu arbeiten beginnt.

Müssen Sie auch manuell eingestellt das windows die Größe hinzufügen

setSize(300, 300);

nach

pack();

Weil die layout-Linien werden automatisch von Netbeans, ich versuche zu verstehen, wie dieses problem zu lösen, da dieser bestimmte code-Zeilen sind gesperrt für die Bearbeitung von Netbeans-Editor.

Ich bin nicht auf Java7 jetzt, kannst du bitte ändern Sie die paint() die paintComponent(),
Hier der code für JDK6: pastebin.com/ukwHX2PR
JLayer Hinzugefügt Java7, für Java6 verwenden JXLayer statt (dann denselben Effekt, aber mit more_over funcioanlities), (vielleicht) nicht kümmern, gibt es ein paar gurus, die weiß, JLayer, verwenden Sie Java7 und mit paintComponent() zu
ehrlich gesagt, ich weiß nicht, wie Sie die "paint" - Methode in WaitLayerUI. Ich nahm es an "wie Sie ist" von der Oracle-Website und von selbst funktioniert. Aber dieses problem habe ich oben angegeben. Ich habe eingestellt, dass JDK6 für das Projekt und es noch funktioniert
Haben Sie versucht, durch das vertauschen der initComponents nennen und die add(jlayer) nennen ? Ich wäre nicht überrascht, wenn Ihr Anrufe in die initComponents Durcheinander mit den JLayer Sie bereits Hinzugefügt, um den frame

InformationsquelleAutor Deviling Master | 2012-08-07

Schreibe einen Kommentar