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
 
Java:
        int altx = jProgressBar2.getX();
        int alty = jProgressBar2.getY();
        jProgressBar2.repaint(altx, alty+50, 1, 1);

die ProgressBar soll hier einfach 50 runterspringen.
 
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
 
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
 
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
 
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();
 
Probiermal:
Java:
            SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					jProgressBar2.setValue(status);
				}
			});


Machst du irgendwo
Code:
jProgressBar2.setMaximum(schreiben.length());
?
 
Zuletzt bearbeitet:
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:
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.
 
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.
 
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);
	}
}
 

Zurück
Oben