[JProgressBar] Raster deaktivieren

Status
Nicht offen für weitere Antworten.

multiholle

Aktives Mitglied
Wenn ich eine JProgressBar verwende ist standardmäßig ein Raster aktiviert. Sie kann z. B. nur die werte 10, 20, 30, 40, ... darstellen, nicht aber 23. Wie kann ich dieses Raster deaktivieren?
 

multiholle

Aktives Mitglied
Ich möchte die Progressbar als Fortschrittsanzeige bei der Musikwiedergabe nutzen. Da sieht es echt doof aus, wenn die Anzeige auf Grund des Rasters ständig springt. Welche Eigenschaft des BoundedRangeModels ist denn für das Raster zuständig?
 

Marco13

Top Contributor
Naja ... eigentlich sollte man das ja darüber regeln können, dass man "setValue" von der Progressbar nur mit den passenden Werten aufruft, aber... der Gedanke mit dem BoundedRangeModel war mir nur spontan gekommen... man könnte ja ein BoundedRangeModel erstellen, das lügt, wenn man es nach seiner value fragt... Hab' gerade mal (nur testweise) in dem ProgressBar-Beispiel von http://java.sun.com/docs/books/tuto...moProject/src/components/ProgressBarDemo.java das Erstellen der ProgressBar geändert, von vorher
progressBar = new JProgressBar(0, 100);
auf
Code:
        DefaultBoundedRangeModel test = new DefaultBoundedRangeModel(0,0,0,100)
        {
            public int getValue()
            {
                return (super.getValue() / 10) * 10;
            }
        };

        progressBar = new JProgressBar(test);
Das sieht erstmal befremdlich aus, aber ... ist vielleicht eine Möglichkeit ... je nachdem, was genau man erreichen will...
 

Illuvatar

Top Contributor
Marco, ich glaub du verstehst das hier gerade falschrum ;)
multiholle will, dass die JProgressBar eben nicht springt.

Allerdings ist das normale Verhalten eben, dass sie das nicht macht. Du müsstest uns mehr Code zeigen, damit wir rausfinden können, warum sie das tut.

Edit: Kurzer "Beweiscode" ;):
[HIGHLIGHT="Java"]import javax.swing.*;

public class Test extends JFrame implements ProgressListener
{
private JProgressBar progress;

public Test()
{
super("Test");

progress = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);
progress.setStringPainted(true);
add(progress);

pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);
}

@Override
public void progress(final int value)
{
if (value == 100) {
dispose();
} else {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
Test.this.progress.setValue(value);
}
});
}
}

public static void main(String[] args)
{
Test test = new Test();
Worker worker = new Worker(test);
new Thread(worker).start();
}
}

interface ProgressListener
{
public void progress(int value);
}

class Worker implements Runnable
{
private final ProgressListener listener;

public Worker (ProgressListener listener)
{
this.listener = listener;
}

@Override
public void run()
{
int timeToSleep = new java.util.Random().nextInt(200) + 50;
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(timeToSleep);
listener.progress(i);
} catch (InterruptedException e) {
return;
}
}
}
}[/HIGHLIGHT]
 
Zuletzt bearbeitet:

Marco13

Top Contributor
@Illuvatar: Jetzt (nach 13 Stunden Schlaf) frage ich mich auch, was ich da "gestern Abend" gelesen habe...?! ???:L
 

multiholle

Aktives Mitglied
Dieser Code erstellt eine Progressbar, die die Werte von 0 bis 10000 darstellt. Trotzdem zeigt sie nicht 0,03 % sondern 0 % und der nächste Schritt ist dann 1 %. Ich möchte aber jeden Wert darstellen.

[highlight="java"]
import javax.swing.*;

public class Test extends JFrame implements ProgressListener
{
private JProgressBar progress;

public Test()
{
super("Test");

progress = new JProgressBar(JProgressBar.HORIZONTAL, 0, 10000);
progress.setStringPainted(true);
add(progress);

pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);
}

@Override
public void progress(final int value)
{
if (value == 10000) {
dispose();
} else {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
Test.this.progress.setValue(value);
}
});
}
}

public static void main(String[] args)
{
Test test = new Test();
Worker worker = new Worker(test);
new Thread(worker).start();
}
}

interface ProgressListener
{
public void progress(int value);
}

class Worker implements Runnable
{
private final ProgressListener listener;

public Worker (ProgressListener listener)
{
this.listener = listener;
}

@Override
public void run()
{
int timeToSleep = new java.util.Random().nextInt(20);
for (int i = 0; i <= 10000; i++) {
try {
Thread.sleep(timeToSleep);
listener.progress(i);
} catch (InterruptedException e) {
return;
}
}
}
}
[/highlight]
 

Marco13

Top Contributor
Ach so, das ist ja nochmal was anderes. Dafür kann man getString überschreiben
Code:
          progress = new JProgressBar(JProgressBar.HORIZONTAL, 0, 10000)
          {
              public String getString()
              {
                  return String.format("%.3f%%", (float)progress.getValue() / progress.getMaximum()); // Oder was auch immer....
              }
          };
 

multiholle

Aktives Mitglied
Das ist auch nicht das, was ich meine. Ich möchte das die Progressbar die Werte ausgibt, die die Konsole im Beispielcode ausgibt.

[highlight="java"]
import javax.swing.*;

public class Test extends JFrame implements ProgressListener
{
private JProgressBar progress;

public Test()
{
super("Test");

progress = new JProgressBar(JProgressBar.HORIZONTAL, 0, 10000) {
@Override
public String getString() {
return String.format("%.3f%%", (float)progress.getValue() / progress.getMaximum() * 100);
}
};
progress.setStringPainted(true);
add(progress);

pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);
}

@Override
public void progress(final int value)
{
if (value == 10000) {
dispose();
} else {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
Test.this.progress.setValue(value);
System.out.println(String.format("%.3f%%", (float) value / 100));
}
});
}
}

public static void main(String[] args)
{
Test test = new Test();
Worker worker = new Worker(test);
new Thread(worker).start();
}
}

interface ProgressListener
{
public void progress(int value);
}

class Worker implements Runnable
{
private final ProgressListener listener;

public Worker (ProgressListener listener)
{
this.listener = listener;
}

@Override
public void run()
{
int timeToSleep = new java.util.Random().nextInt(20);
for (int i = 0; i <= 10000; i++) {
try {
Thread.sleep(timeToSleep);
listener.progress(i);
} catch (InterruptedException e) {
return;
}
}
}
}
[/highlight]
 

max40

Bekanntes Mitglied
[HIGHLIGHT="Java"]SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {

Test.this.progress.setValue(value); // Wert setzen

String s = String.format("%.3f%%",(float) value / 100);
Test.this.progress.setString(s); // Text akt.
System.out.println(s);
}
});
[/HIGHLIGHT]
 

Marco13

Top Contributor
Waha - böse Falle :autsch: Was soll das denn? ???:L Wenn man "setValue" macht, sollte man ja eigentlich annehmen, dass auch neu gezeichnet wird. Wird aber nicht. Und es sollte IMHO auch nicht notwendig sein. Nach dem Durchpflügen der Sources von ProgressBar & Co konnte ich es zurückverfolgen auf BasicProgressBarUI.Handler, wo tatsächlich steht
Code:
    public void stateChanged(ChangeEvent e) {
            ...
	    if (newPercent != oldPercent) {
		setCachedPercent(newPercent);
		progressBar.repaint();
	    }
Es wird also tatsächlich nur repaintet, wenn sich die Prozentzahl ändert :autsch: (Sieht man auch, wenn man die ProgressBar mit der Maus vergrößert und verkleinert: Dann auch zwischendurch repaintet, und es wird immer der richtige Text angezeigt - auch die Zwischenschritte)

Um deine ursprüngliche Frage also (hoffentlich) zu beantworten: Dieses scheinbare(!) "Raster" kommt daher, dass nur dann ein repaint gemacht wird, wenn sich die Prozentzahl ändert - warum auch immer :bahnhof:

Eine Möglichkeit ist, wie max40 schon geschrieben hat, den TEXT per Hand zu setzen (dann wird auch repaintet) - ich find's aber unschön, dass das notwendig ist: Dort, wo man irgendeine Zahl setzt, will (und sollte) man sich keine Gedanken drum machen müssen, wie (oder wann :autsch: ) der Text in der GUI dargestellt wird... eine in diesem Sinne "sauberere" Lösung wäre IMHO sowas wie
Code:
          progress = new JProgressBar(JProgressBar.HORIZONTAL, 0, 10000)
          {
              @Override
              public String getString()
              {
                  return String.format("%.3f%%", (float) getValue() / 100);
              }
              protected void fireStateChanged()
              {
                  super.fireStateChanged();
                  repaint();
              }
          };
Aber IMHO grenzt diese Sache, dass nur bei Prozent-Grenzen neu gezeichnet wird, schon fast an einen Bug....
 

max40

Bekanntes Mitglied
Also wenn ich eine ProgressBar habe wo nur drin stehen soll "Bitte warten sie" oder sowas, finde ich das richtig und gut das er kein repaint macht! Und wenn du den Wert setzt, ist es ja nicht so viel aufwand nochmal setString aufzurufen!
 

Marco13

Top Contributor
Naja, bei "Bitte warten" wäre die ProgressBar vermutlich "indeterminate", und selbst wenn, wäre der Aufwand zu Neuzeichnen ja nicht dramatisch. Der Aufwand, den String per Hand zu setzen ist natürlich auch nicht so hoch - ich finde es nur irgendwie unschön... :rolleyes:
 

multiholle

Aktives Mitglied
@Marco13
Deine Methode funktioniert wunderbar. Danke :) Was macht eigentlich die Funktion fireStateChanged(), wann wird sie aufgerufen?
 

Marco13

Top Contributor
Die wird immer aufgerufen, wenn sich das darunterliegende Datenmodell (d.h. das BoundedRangeModel) ändert. An das jeweilige Modell wird ein ChangeListener gehängt, der nichts anderes macht, als diese Methode aufzurufen (die wiederum ChangeListener benachrichtigt, die an der JProgressBar hängen). Standardmäßig hängt an der ProgressBar der oben angesprochene BasicProgressBarUI$Handler als ChangeListener, der bei vollen Prozenten das repaint auslöst. Jetzt wird das repaint eben bei jeder Änderung am Datenmodell aufgerufen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
C JProgressBar und ihre Tücken AWT, Swing, JavaFX & SWT 8
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
T LayoutManager GridBagLayout / erwartetes Raster fehlt AWT, Swing, JavaFX & SWT 3
A SWT: Daten in Raster mit Gitternetzlinien darstellen AWT, Swing, JavaFX & SWT 7
W Objekt-array als Raster visualisieren AWT, Swing, JavaFX & SWT 3
S Koordinaten/Raster (ähnlich Schachbrett) anzeigen/ausblenden AWT, Swing, JavaFX & SWT 10
_user_q JavaFX Wie kann ich alle Objekte außer eins deaktivieren (das Gleiche mit BoxBlur)? AWT, Swing, JavaFX & SWT 11
missy72 JavaFX CellFactory deaktivieren, oder löschen AWT, Swing, JavaFX & SWT 2
L Swing Fehlerton deaktivieren? AWT, Swing, JavaFX & SWT 4
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
K JavaFX DatePicker - Tage aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 1
L Javafx Datepicker Zukunft deaktivieren AWT, Swing, JavaFX & SWT 3
A Touch-Display deaktivieren (Zeitabhängig) AWT, Swing, JavaFX & SWT 3
F jTabbedPane Tabwechsel deaktivieren AWT, Swing, JavaFX & SWT 2
V RadioButton aktivieren/deaktivieren; Zustand abfragen und wechseln AWT, Swing, JavaFX & SWT 2
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
G JButton deaktivieren greift nicht AWT, Swing, JavaFX & SWT 14
M jtabbedpane aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 13
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
J JButtons in aktivieren und deaktivieren AWT, Swing, JavaFX & SWT 3
A LookAndFeel Rollover Effekt bei JTabbedPane deaktivieren (Nimbus) AWT, Swing, JavaFX & SWT 8
M SWT - Fenster "Deaktivieren" AWT, Swing, JavaFX & SWT 2
E Buttons während einer Berechnung deaktivieren AWT, Swing, JavaFX & SWT 6
M Swing JTabbedPane Panels deaktivieren AWT, Swing, JavaFX & SWT 2
T JFileChooser - "Öffnen-Button" aktivieren/deaktivieren möglich??? AWT, Swing, JavaFX & SWT 2
Y JRadioButton soll JTextBox aktivieren UND deaktivieren AWT, Swing, JavaFX & SWT 3
B SWT Buttons aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 3
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
T JmenuItems in JPopupMenu kontextabhängig deaktivieren AWT, Swing, JavaFX & SWT 2
K JToggleButton deaktivieren (komplettes event nehmen) AWT, Swing, JavaFX & SWT 2
T JTable: editieren bei Doppelklick deaktivieren, aber... AWT, Swing, JavaFX & SWT 2
algorismi Knoten im JTree deaktivieren AWT, Swing, JavaFX & SWT 4
L Fenster inaktiv setzen / deaktivieren (unable to close window) AWT, Swing, JavaFX & SWT 16
G Swing Fortschrittsbalken im Fenster: Menü deaktivieren / abfangen? AWT, Swing, JavaFX & SWT 27
André Uhres Swing Alle Komponenten eines JPanel aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 4
G Wiederholten Tastenanschlag deaktivieren AWT, Swing, JavaFX & SWT 7
M ALT shortcut für JMenuBar deaktivieren AWT, Swing, JavaFX & SWT 3
I JList - Einträge deaktivieren AWT, Swing, JavaFX & SWT 2
V Menüeinträge im DropDown-Menü deaktivieren AWT, Swing, JavaFX & SWT 3
A JList deaktivieren AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben