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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Robin hat wichtige Informationen, und scheint, wie Sie begrenzt von der Nutzung der GuiBulder..., dann bin ich nicht weiter kommentieren möchte etwas, das Ergebnis ist
von wenig modifizierten code
haben, fügen Sie zwei
JButtons
man für den Anfang und das zweite für Stopp (anzeigen und ausblenden der animierten Gig)nicht Fälscher, die
JPanel
umgesetzt hatFlowLayout
, dass ziemlich annehmenPreferredSize
kam von der childs,Master aaaach, dann müssen Sie auf die bekannten Java, Swing und GuiBuilder, jede von Ihnen lebt Ihr eigenes Leben, sorry das ich zu faul bin, meine endlose lazyness, dann lasse ich etwas für die Wale, .... :-), die meisten von Ihnen veraltet ist, jede Entwicklung endete in dem moment, wenn sich die Sonne verändert, Oracle, aus Java7, SwingX, JavaFx .... etc.
Sorry, aber mir ist Englisch nicht sehr gut. Was ist mit den Walen?
InformationsquelleAutor mKorbel
Fand eine bessere einfache (und funktionierende) Lösung mit Swing-Komponenten Erweiterung von SwingLabs
JXBusyLabel
Es ist eine vollständige Integration plugin mit NetBeans für seinen editor, so ist sehr einfach zu bedienen
InformationsquelleAutor Deviling Master
Scheint es auf Ihre Fragen und Kommentare, die Sie haben Probleme bei der Implementierung der
JLayer
in Netbeans, würde ich vorschlagen, dann eher für eineCardLayout
die Ihnen erlaubt, wechseln Sie zwischen Ihren normalenJPanel
und der mit der spinner.Hier ist ein einfaches tutorial: CardLayout Mit Netbeans
card2
völlig disappaer, weil Sie die-Taste, um zum Karte2 funktioniert nicht anymor. Aber wenn Sie diese Zeile auskommentierenJLayer<JPanel> jlayer = new JLayer<>(card2, layerUI)
dann versuchen Sie die Schaltfläche 'Karte2' appaerInformationsquelleAutor David Kroukamp