ProgressBar neu positionieren

Laren

Bekanntes Mitglied
Hi,

Ich habe ein Fenster und auf dem Fenster ist eine Liste mit Aufträgen, die das Programm abarbeiten soll. Ist das Programm mit einem Auftrag fertig springt es in der Liste zum nächsten Auftrag.
Jetzt ist neben dieser Liste ein kleiner ProgressBar um dem User zu zeigen, wo das Programm gerade ist und wie weit es mit dem Auftrag fortgeschritten ist.
Der Fortschritt funktioniert super, aber wie kann ich die Progressbar mitnehmen/neu positionierten?

Habe es mit "jProgressBar.repaint();" versucht, aber da macht er gar nichts.???:L


Viele Grüße
 

Laren

Bekanntes Mitglied
Java:
        int altx = jProgressBar2.getX();
        int alty = jProgressBar2.getY();
        jProgressBar2.repaint(altx, alty+50, 1, 1);

die ProgressBar soll hier einfach 50 runterspringen.
 

Dit_

Bekanntes Mitglied
was meinst du mit mitnehmen?
Soll ProgressBar auf der Höhe des aktuellen Auftrags sein?
Dann könnte man statt einer Liste, JTable nehmen, eine Spalte für Progressbar konfigurieren und immer der aktuellen Zeile ProgressBar übergeben, bzw. sichtbar machen. siehe CellRenderer.

Man kann ja in der Tabelle die Linien unsichtbar machen, so dass JTable wie eine normale Liste aussieht.

Sonst. Benutze die methoden
Code:
#remove() , #add(), #validate(), #rapaint()


gruss
 

Michael...

Top Contributor
Für die Platzierung und Anordnung einer Komponente ist grundsätzlich der LayoutManager zuständig.
Grundsätzlich wird das aber schwierig synchron zu halten - besonders sobald die Liste scrollbar wird.

Bessere (aber auch kompliziertere) Möglichkeiten:
In dem Fall würde sich aber eventuell auch eine JTable anbieten.
Oder man packt die ProgressBar mit in die Zelle rein. Stichwort: ListCellRenderer
 

AmunRa

Gesperrter Benutzer
auch wenn das wie du es vorhast nicht sehr schön ist, da du hier keine n LayoutManager verwendest, wie ich vermute, kannst du so etwas machen
Java:
 int alty = jProgressBar2.getY();
      jProgressBar2.setY(alty+50);

und dann repaint von den Panel aufrufen zu dem der Progressbar hinzugefügt wurde

Aber vl überlegst du dir dein Layout nocheinmal und verwendest die Vorschläge von meinen Vorpostern
 

Laren

Bekanntes Mitglied
Ok,

das funktioniert nun auch^^, jetzt ist mir eben ein fehler aufgefallen.
Die ProgressBar updatet sich nicht wie gewünscht.
Ich habe wie man unten sieht, die Variable status, die den Prozentwert von "schreiben.getFilePointer"(wo liest er gerade) und "schreiben.length()" (wie groß ist die Datei).
Var. status wollte ich nun immer wieder in der Konsole ausgeben. Aber er spuckt die Variable nicht nacheinander aus, sonder auf einmal.
Das gleiche mit der ProgressBar, sie läuft nicht stetig, sonder haut am Ende des Vorgangs direkt auf die 100%.
Wie schaffe ich es, dass sie mir den "wircklichen" Status ausgiebt?
Grüße
Java:
  Reader f = new FileReader(datei);
           RandomAccessFile schreiben = null;
            schreiben = new RandomAccessFile(datei, "rw");
                     
           while(f.read() !=-1)
            {
                
             schreiben.writeBytes("d");
             
               int status = (int) ((schreiben.getFilePointer()*100) / schreiben.length());
                this.jProgressBar2.setValue(status);
               // System.out.print(status);
            }
            
            f.close();
            schreiben.close();
 

Dit_

Bekanntes Mitglied
Probiermal:
Java:
            SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					jProgressBar2.setValue(status);
				}
			});


Machst du irgendwo
Code:
jProgressBar2.setMaximum(schreiben.length());
?
 
Zuletzt bearbeitet:

Laren

Bekanntes Mitglied
Ich verstehe jetzt nicht so ganz, wo ich das einbauen soll.

Machst du irgendwo jProgressBar2.setMaximum(schreiben.length()); ?

Ich hab den ProgressBar mit Netbeans eingefügt, da kann man den max direkt eingeben.
Dieser ist 100, da ich ja prozentual rechne.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Entscheidend ist, dass das Einlesen der Datei in einem eigenen Thread abläuft, da sonst der EDT mit der Aktualisierung des GUI solange blockiert wird, bis die Datei fertig eingelesen ist.
 

Dit_

Bekanntes Mitglied
Java:
  Reader f = new FileReader(datei);
           RandomAccessFile schreiben = null;
            schreiben = new RandomAccessFile(datei, "rw");
                     
           while(f.read() !=-1)
            {
                
             schreiben.writeBytes("d");
             
               int status = (int) ((schreiben.getFilePointer()*100) / schreiben.length());
               SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    jProgressBar2.setValue(status);
                }
            });
               // System.out.print(status);
            }
            
            f.close();
            schreiben.close();

Vielleicht lohnt es sich SwingWorker anzuschauen.
 

Michael...

Top Contributor
Wie gesagt, das Auslesen der Dateien muss in einem separaten Thread laufen, z.B. mittels SwingWorker.

Hier mal eine recht grob, wie ich sowas implementieren würde - allerdings ohne SwingWorker. Die Klasse DataLoader "simuliert" das Lesen der Datei.
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

public class LoadingListDemo extends JFrame {
	private List<ListEntity> entityList;
	private JList jList;
	
	public LoadingListDemo () {
		entityList = new ArrayList<ListEntity>();
		for (int i=0; i<6; i++)
			entityList.add(new ListEntity("Entity " + i));
		DefaultListModel model = new DefaultListModel();
		for (ListEntity e : entityList)
			model.addElement(e);
		jList = new JList(model);
		jList.setCellRenderer(new LoadingRenderer());
		this.getContentPane().add(new JScrollPane(jList));
		new Thread(new DataLoader(entityList)).start();
	}
	
	class LoadingRenderer extends DefaultListCellRenderer {
		private JPanel panel;
		private JLabel title;
		private JProgressBar bar;
		private Border border;
		
		public LoadingRenderer() {
			panel = new JPanel(new GridLayout(2, 1));
			panel.add(title = new JLabel());
			panel.add(bar = new JProgressBar());
			bar.setOpaque(false);
			panel.setBorder(border = BorderFactory.createLineBorder(Color.GRAY));
		}
		
		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
			super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
			ListEntity ent = (ListEntity) value;
			if (ent.getStatus()<100) {
				panel.setBackground(this.getBackground());
				if (ent.getStatus()==0) {
					title.setForeground(Color.LIGHT_GRAY);
					title.setText("  " + ent.getTitle() + "    waiting...");
				}
				else {
					title.setForeground(Color.BLUE);
					title.setText("  " + ent.getTitle() + "    loading...");
				}
				bar.setValue(ent.getStatus());
				return panel;
			}
			this.setBorder(border);
			this.setText("  " +ent.getTitle() + "    completed");
			return this;
		}
	}
	
	class ListEntity {
		private String title;
		private int status;
		
		public ListEntity(String title) {
			this.title = title;
			status = 0;
		}
		
		public String getTitle() {
			return title;
		}
		
		public synchronized void setStatus(int status) {
			this.status = status;
			if (this.status > 100)
				this.status = 100;
		}
		
		public synchronized int getStatus() {
			return this.status;
		}
	}
	
	class DataLoader implements Runnable {
		private List<ListEntity> list;
		
		public DataLoader(List<ListEntity> list) {
			this.list = list;
		}
		
		public void run() { //Hier werden die Daten abgearbeitet
			for (ListEntity entity : list) {
				int status;
				while((status = entity.getStatus())<100) {
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					entity.setStatus(status + (int)(Math.random() * 30));
					jList.repaint();
				}
			}
		}
	}
	
	public static void main(String[] args) {
		JFrame frame = new LoadingListDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Progressbar aktualisieren Java Basics - Anfänger-Themen 17
C ProgressBar updaten Java Basics - Anfänger-Themen 4
felix92 MP3-Player ProgressBar Java Basics - Anfänger-Themen 29
Y Progressbar beim Mysqldump Java Basics - Anfänger-Themen 3
T Progressbar füllen? Java Basics - Anfänger-Themen 3
X BufferedWriter Dauer in ProgressBar ausgeben? Java Basics - Anfänger-Themen 2
1 Erste Schritte Progressbar füllen ?? Java Basics - Anfänger-Themen 5
C ProgressBar funktioniert nicht Java Basics - Anfänger-Themen 18
K Erste Schritte Progressbar geht nicht Java Basics - Anfänger-Themen 5
P Progressbar auf der Console Java Basics - Anfänger-Themen 12
P Aktualisierungsproblem mit Progressbar Java Basics - Anfänger-Themen 5
M jLabel aktuallisieren bzw Progressbar für Zeitanzeige Java Basics - Anfänger-Themen 5
M FTP Upload Applet - ProgressBar Java Basics - Anfänger-Themen 5
C Auf ProgressBar von zwei verschiedenen .class Dateien zugrei Java Basics - Anfänger-Themen 2
P Label nicht bei Progressbar zu sehen Java Basics - Anfänger-Themen 8
G ProgressBar ist verdeckt Java Basics - Anfänger-Themen 2
E ProgressBar für Kopieraktion Java Basics - Anfänger-Themen 21
H Wie hier die Progressbar benutzen? Java Basics - Anfänger-Themen 8
B Problem mit ProgressBar Java Basics - Anfänger-Themen 4
C Farbe von ProgressBar ändern Java Basics - Anfänger-Themen 3
G Progressbar aktualisiert nicht Java Basics - Anfänger-Themen 3
KeVoZ_ Label auf JFrame willkürlich Positionieren Java Basics - Anfänger-Themen 2
R Bilder positionieren Java Basics - Anfänger-Themen 5
M JLabel auf JPanel positionieren Java Basics - Anfänger-Themen 8
B Menue frei positionieren Java Basics - Anfänger-Themen 3
S Zeichen aus Strings auslesen und in zweidimensionalen Reihungen positionieren. Java Basics - Anfänger-Themen 10
M Panels regelmässig neu positionieren Java Basics - Anfänger-Themen 11
P Label erstellen und positionieren Java Basics - Anfänger-Themen 5
S Wie komponenten positionieren? Java Basics - Anfänger-Themen 6
E Komponenten auf Panel positionieren Java Basics - Anfänger-Themen 3
F prob beim positionieren eines banners Java Basics - Anfänger-Themen 4
H JLabel positionieren Java Basics - Anfänger-Themen 4
G JLabelinhalt positionieren Java Basics - Anfänger-Themen 2
P Button positionieren Java Basics - Anfänger-Themen 3
G JToogleButton - Positionieren des Icons Java Basics - Anfänger-Themen 8
G drucken: genaues positionieren Java Basics - Anfänger-Themen 2
? jtable positionieren. Java Basics - Anfänger-Themen 12
F Button positionieren Java Basics - Anfänger-Themen 2
H Button auf AWT Fläche pixelgenau positionieren Java Basics - Anfänger-Themen 4
P Cursor in Konsole positionieren Java Basics - Anfänger-Themen 5
S Frame schließen und positionieren Java Basics - Anfänger-Themen 7
N TextField positionieren Java Basics - Anfänger-Themen 7
J Positionieren eines showConfirmDialog? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben