Scrolling implementieren mit JPanels

Status
Nicht offen für weitere Antworten.
J

jhjp

Gast
Hallo Leute,
ich bin am Ende... seit einer Woche mach ich an dem Problem bereits rum und komm auf keinen grünen Zweig.

Also ich hab ein Programm, das enthält ein JPanel in dem viele einzelnen JPanels (Entries) untereinander gelistet werden.
Von der Größe her passen 9 Entries in das große Panel.
Mit den Pfeiltasten hoch und runter kann man die Entries auswählen. Man kann maximal 1 Entry auswählen. Zu Beginn ist keins ausgewählt. Solange es weniger 10 Entries sind funktioniert das auswählen wunderbar.

Wenn jetzt aber mehr als 9 Entries in das Panel sollen muss ich scrollen.
Das heißt, wenn der currentIndex (-> gibt an, welchen Index der gewählte Entry hat) > lastVisibleIndex muss das JPanel so gefüllt werden:
Code:
for(int i=currentIndex-8; i<=currentIndex)

Wenn der currentIndex < firstVisibleIndex:
Code:
for(int i=currentIndex; i<=currentIndex+8)

Sonst (currentIndex im Bereich zwischen first und lastVisibleIndex):
Code:
for(int i=firstVisibleIndex; i<=lastVisibleIndex)

oder?
ich bekomm da beim testen sehr häufig ne indexoutofboundsexception

Habs dann komplett neu versucht:
entryList enthält EntryPanel Objekte und zwar ALLE. (bis zu 100stk)
Code:
if(entryList.size() > 9){
if(currentIndex < 9  && letztesSichtbaresElement_ListEntry == 8){
					clearEntries();
					int y = 49;
					for(EntryPanel ep : entryList){ 
						if(entryList.indexOf(ep) > 9)
							return;
						ep.setBounds(0, y, 518, entryHeight);
						y += entryHeight;
						add(ep);
					}
				}
				if(currentIndex == letztesSichtbaresElement_ListEntry+1){
					clearEntries();
					int y = 49;
					for(int i=(0+currentIndex-8); i<(9+currentIndex-8); i++){
						entryList.get(i).setBounds(0, y, 518, entryHeight);
						y += entryHeight;
						add(entryList.get(i));
					}
					
					letztesSichtbaresElement_ListEntry = currentIndex;
				}
				if(currentIndex == letztesSichtbaresElement_ListEntry-9){
					clearEntries();
					int y = 49;
					for(int i=(letztesSichtbaresElement_ListEntry-9); i<letztesSichtbaresElement_ListEntry; i++){
						entryList.get(i).setBounds(0, y, 518, entryHeight);
						y += entryHeight;
						add(entryList.get(i));
					}
					letztesSichtbaresElement_ListEntry--;
				}
}else{
scrollBar.setVisible(false);
			clearEntries();
			int y = 49;
			for(EntryPanel ep : entryList){ //es können auch weniger als 9 objekte drin sein
				if(entryList.indexOf(ep) > 9)
					return;
				ep.setBounds(0, y, 518, entryHeight);
				y += entryHeight;
				add(ep);
			}
		}

funktioniet aber au net.

Kann das wirklich so schwer sein oder bin ich einfach zu blöd?

Hoffe, dass mir jemand helfen kann...

Gruß Beni
 
S

SlaterB

Gast
die viele Rechnung verwirrt ja,
klappt ein einfacher Befehl setBounds(0, 400, 518, 30);
oder was auch immer ein gutes Beispiel ist?

ich weiß nicht ob das überhaupt dein Beispiel trifft,
gehts überhaupt um die Anzeige oder um IndexOutOfBoundExceptions?

vereinfach doch mal alles,
ein Panel mit 2 Entries insgesamt, so dass sofort gescrollt werden muss, um das zweite zu sehen

bitte kompletten Code posten,
und sollte mit allem drum und dran kaum mehr als diese 47 Zeilen da sein ;)
 
J

jhjp

Gast
erstmal danke für deine Antwort!
lassen wir mal meinen code weg... des wird eh zu viel.

also es ist so:
ich hab ne entryList (ArrayList<EntryPanel>()) EntryPanel erbt von JPanel.
und ein JPanel das diese EntryPanels darstellt.
Zu beginn des Programms, wird die entryList gefüllt und dann wird jedes EntryPanel aus der Liste dem JPanel hinzugefügt. Soweit so gut. Das Scrollen funktioniert hier auch einwandfrei.

Das Problem ist, diese Liste wird verändert, während sie angezeigt wird (wobei das aktive Element auch aktiv bleiben soll)!

Bei einer Änderung muss die Liste automatisch gescrollt werden, da es ja sein kann, dass das aktive Element außerhalb der 9 dargestellten EntryPanels liegen kann.
Liegt es "zu weit oben" soll die Liste soweit hochscrollen, dass das erste Element das aktive ist. Ist es zu weit unten, muss die Liste so gescrollt werden, dass das aktive Element ganz unten ist.

Code:
Das aktive EntryPanel in einer Variable speichern.

Die Liste und den Inhalt des JPanels löschen.

Die einzelnen EntryPanels neu erstellen und bei neuesEntryPanel == aktivesEntryPanel s.o., das neueEntryPanel auf aktiv setzen.

Jetzt den currentIndex noch auf das aktive Panel setzen.

Jetzt fehlt nur noch das automatische scrollen und ich hab keine Ahnung wie das gehen soll.

Könntet ihr mir bitte pseudocodetechnisch einen Tipp geben !?

Achja, die Liste ist sortiert! Ein einfaches "hinten anhängen" geht net.

Danke!
Gruß Beni
 
S

SlaterB

Gast
ich kann aus dem Kopf zu Scrolling gar nix sagen,
evtl. heute abend von zu Hause aus aus einem alten Programm von mir was posten,

wenn du Code hättest könnte ich nach Fehlern schauen
 
J

jhjp

Gast
ES GEHT!!! Juhuuuu
durch das Verfassen des Forumbeitrags bekam ich ne neue Idee und tats�chlich -> es scrollt so, wie ich es gern h�tte.
Aber ein Problem besteht nach wie vor noch:
Der Code ist nicht "threadsafe". Es gibt �fters eine java.util.ConcurrentModificationException oder IndexOutOfBoundsException -> ich muss wahrscheinlich irgendwo ein synchronized() einf�gen, oder?

Hier nun der Code:
Die GUI Klasse -> wird gestartet mit .start() gestartet und enth�lt alle Panels.
Die Gui sieht so aus: 3 Spalten. links ein Label auf dem zur�ck steht, in der mitte das JPanel, das die gescrollte Liste enth�lt, rechts ein Label auf dem auswh�hlen steht. Die gesamte GUI wird mit den Pfeiltasten gesteuert (keine Maus!)
Hoch runter = ausw�hlen, Links = zur�ck, Rechts = weiter
Die Methode refresh() wird von einem andern Thread aufgerufen, sobald sich Daten ge�ndert haben. -> Dann muss die Gui die Datenbank neu auslesen und currentState.refresh(neue Daten) aufrufen.
currentState = Status (ein "Fenster", welches die gescrollte Liste enth�lt. Beim Dr�cken der Links / Rechts Tasten wird sozusagen nur der Status ge�ndert (setVisible(true/false))
Wichtig ist hier eigentlich nur die Methode update()

Code:
public class Gui extends JFrame implements IGui {

	//Attributes
	//Colors
	public final static Color STANDARD = new Color(250, 250, 219);
...
	
	//Keys
	final private static int KEY_LEFT = 37;
...
	
	//States
	private State START;
	private State LIST_ROADS;
...
	
	//Database
	protected static IDatabase database;
	
	//Zwischenspeicher der EventListe
	private List<Event> eventList;
	
	//der aktuelle Zustand f�r die Statemachine
	private State currentState;
	
	//Panels
	private JPanel background; //nur damit der hintergrund schwarz ist
	private JPanel borderPanel; //f�r nen sch�nen rand, da panel ja schon n rand hat(icon)
	private JLayeredPane panel; //beinhaltet buttons und listpanel
	private JPanel pleaseWait; //ist das unterste Panel mit bitte Warten!
	private Header pleaseWaitHeader;
	private JTextField currentPosition; //zeigt die aktuelle Position an
	
	private static Gui gui;
	
	
	//Constructor
	public Gui(){
	}
	
	
	//Methods
	public void start() {
		//Die States initialisieren + unsichtbar machen bis auf START, dem panel hinzuf�gen
		START = new START();
		LIST_ROADS = new LIST_ROADS();
		LIST_ONEROAD = new LIST_ONEROAD();
		LIST_INCOURSE = new LIST_INCOURSE();
		DETAIL = new DETAIL();
		
		//Die Panels initialisieren		
		panel = new JLayeredPane();
		panel.setBorder(javax.swing.BorderFactory.createMatteBorder(0, 0, 800, 479, new ImageIcon(getClass().getResource("/images/bg.jpg"))));
		panel.setBounds(0, 2, 800, 479);
		panel.setLayout(null);
		
		//Die States dem Panel hinzuf�gen
		panel.add(START, new Integer(1));
		panel.add(LIST_ROADS, new Integer(1));
		panel.add(LIST_ONEROAD, new Integer(1));
		panel.add(LIST_INCOURSE, new Integer(1));
		panel.add(DETAIL, new Integer(1));
		
		//das Bitte Warten Panel -> wenn kein State aktiv ist
		pleaseWait = new JPanel();
		pleaseWait.setLayout(null);
		pleaseWait.setBounds(141, 0, 518, 479);
		pleaseWait.setBackground(Gui.STANDARD);
		pleaseWaitHeader = new Header();
		pleaseWaitHeader.setText("", "Bitte warten...");
		pleaseWait.add(pleaseWaitHeader);
		panel.add(pleaseWait, new Integer(0));
		
		//den Startzustand herstellen
		currentState = START;
		currentState.activate();
		update();
		
		//BorderPanel
		borderPanel = new JPanel();
		borderPanel.setBorder(new EtchedBorder(Color.GRAY, Color.white));
		borderPanel.setLayout(null);
		borderPanel.setBounds(0, 60, 800, 483);
		borderPanel.add(panel);
		
		//Hintergrund noch erzeugen
		background = new JPanel();
		background.setLayout(null);
		background.setBackground(Color.black);
		background.setBounds(0, 0, 800, 600);
		background.add(borderPanel);
		
		//CurrentPosition
		currentPosition = new JTextField("");
		currentPosition.setBounds(5, 550, 200, 20);
		currentPosition.setBackground(Color.black);
		currentPosition.setForeground(Color.white);
		currentPosition.setEditable(false);
		currentPosition.setFocusable(false);
		currentPosition.setBorder(null);
		add(currentPosition);
		
		//Allgemeines Zeugs
		add(background);
		setName("TMCFilter V2");
		setSize(800,600);
		setUndecorated(true);
		setLayout(null);
		setVisible(true);
		
		
		//ActionListener
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent event) {
               keyEvent(event.getKeyCode());
            }
        });
	}
	



	public void update() {
		synchronized(database){
			eventList = database.readAllEventsLazy();
		}
		currentState.refresh(eventList);
		refresh();
	}



	
	public void update(String newPosition) {
		currentPosition.setText(newPosition);
		update();
	}
	
	public static void refresh(){
		gui.repaint();
	}
	
	
	//Die Statusmaschine
	private void keyEvent(int keyPressed){
		if(keyPressed == 32){ //Leertaste
			Main.togglePause();
		}
		else if(currentState.getClass() == START.class){
			if(keyPressed == KEY_LEFT){
				System.exit(0);
			}
			if(keyPressed == KEY_DOWN){
				currentState.activateNextEntry();
				currentStartState = STARTINCOURSE;
			}
			if(keyPressed == KEY_UP){
				currentState.activateLastEntry();
				currentStartState = STARTALL;
			}
			if(keyPressed == KEY_RIGHT){
				if(currentStartState == STARTALL){
					//den aktuellen Zustand deaktivieren -> bitte warten sichtbar
					currentState.deactivate();
					
					//den neuen Zustand vorbereiten
					LIST_ROADS.prepare(eventList, null);
					
					//als neuen currentState setzen und aktivieren (setVisible)
					currentState = LIST_ROADS;
					currentState.activate();
				}
				if(currentStartState == STARTINCOURSE){
...
				}
			}
		}
		else if(currentState.getClass() == LIST_ROADS.class){
			if(keyPressed == KEY_LEFT){
				currentState.deactivate();
				currentState = START;
				currentState.activate();
			}
			if(keyPressed == KEY_DOWN){
				currentState.activateNextEntry();
			}
			if(keyPressed == KEY_UP){
				currentState.activateLastEntry();
			}
			if(keyPressed == KEY_RIGHT){
...
			}
	        }
		refresh();
	}
	
	
	//Getters und Setters
	public void setDatabase(IDatabase database) {
		Gui.database = database;
	}
	
	public static IDatabase getDatabase(){
		return database;
	}
	
	public static IGui getInstance(){
		gui = new Gui();
		return gui;
	}
}


Die State Klasse
Code:
public abstract class State extends JPanel{

	//Attributes
	protected Header header;
	protected Button nextButton;
	protected Button backButton;
	protected JScrollBar scrollBar;
	protected int currentIndex = -10;
	protected List<EntryPanel> entryList;
	protected JPanel container;
	
	//F�r das Scrolling
	protected int firstVisibleIndex;
	protected int lastVisibleIndex;
	

	//Constructor
	public State(){
		container = new JPanel();
		container.setBounds(141, 0, 518, 479);
		container.setLayout(null);
		container.setOpaque(false);
		
		scrollBar = new JScrollBar(SwingConstants.VERTICAL);
		scrollBar.setBounds(503, 49, 15, 430);
		scrollBar.setUI(new com.sun.java.swing.plaf.windows.WindowsScrollBarUI());
		scrollBar.setBackground(Gui.STANDARD);
		scrollBar.setForeground(Gui.ACTIVE);
		scrollBar.setVisible(false);
		container.add(scrollBar);
		
		entryList = new ArrayList<EntryPanel>();
		
		add(container);
		setBounds(0, 0, 800, 479);
		setOpaque(false);
		setLayout(null);
		setVisible(false);
	}
	
	
	//Methods
	public abstract void activateNextEntry();
	public abstract void activateLastEntry();
	public abstract void refresh(List<Event> eventList);
	public abstract void prepare(List<Event> eventList, Object markedEntryId);
	protected abstract void showEntries();

	public EntryPanel getActiveEntry(){
		//Soll das aktive EntryPanel zur�ckgeben!
		//ACHTUNG: erst pr�fen, ob currentIndex auch g�ltig ist
		if(0 <= currentIndex  && currentIndex < entryList.size())
			return entryList.get(currentIndex);
		else 
			return null;
	}
	
	public void setHeader(String tracing, String text){
		header.setText(tracing, text);
	}
	
	public void activate() {
		setVisible(true);
	}

	public void deactivate() {
		setVisible(false);
	}
	
	protected void setScrollBarValue(int value){
		scrollBar.setValue(value);
	}
	
	protected void showActiveEntry(){
		//Setze die Buttons auf die H�he des aktiven Eintrags
		//ACHTUNG: erst pr�fen, ob currentIndex auch in der entryList vorkommt!
		if(0 <= currentIndex && currentIndex < entryList.size()){
			backButton.setTopSpace(entryList.get(currentIndex).getBounds().y);
			nextButton.setTopSpace(entryList.get(currentIndex).getBounds().y);
			nextButton.setVisible(true);
			setScrollBarValue(currentIndex);
		}
		else{ //Falls kein Eintrag markiert ist
			backButton.setTopSpace(0);
			nextButton.setVisible(false);
		}
	}
	
	protected void clearEntries(){
		//Die alte Liste l�schen -> Container enth�lt Scrollbar, Header und EntryPanels
		Component[] components = container.getComponents();
		
		//Scrollbar und Header besetzen index 0 und 1 -> alle andern sind EntryPanels
		for(int i=2; i<components.length; i++){
			container.remove(components[i]);
		}
	}
}


//Die List-Roads Klasse -> erbt von State und zeigt eine Stra�enliste an (Autobahnbezeichnungen) -> diese Liste wird dann gescrollt. Hab 3 Kommentare reingesetzt //TODO... bei denen die Exceptions auftraten
prepare() wird aufgerufen, sobald der Zustand aktiviert wird
refresh() sobald die Gui die Meldung bekommt, dass sich die Daten geändert haben.
Code:
public class LIST_ROADS extends State{

	//Attributes
	final private int entryHeight = 49;
		
	//Construcotr
	public LIST_ROADS(){
		super();
		
		scrollBar.setVisibleAmount(9);
		
		//Buttons
		backButton = new Button("zur�ck", Button.LEFT);
		nextButton = new Button("ausw�hlen", Button.RIGHT);
		
		//Header
		header = new Header();
		
		add(backButton);
		add(nextButton);
		container.add(header);
	}
	
	
	//Methods
	@Override
	public void prepare(List<Event> eventList, Object markedEntryId){
		//hier soll der neue Zustand vorbereitet werden
		//geg: aktuelle EventList, id des markierten Elements: hier egal
		//zu tun: Header setzen, reset: currentIndex, activeEntry, DELETE liste l�schen vom vorhergehenden ~zustand,
		//liste gruppieren nach Stra�en, Sortieren, Eintr�ge erzeugen -> anzeigen
		
		//Header setzen
		header.setText("Navi > TMC > alle:", "ALLE NACHRICHTEN");
		
		//Reset, vom vorhergehenden
		entryList = new ArrayList<EntryPanel>();
		scrollBar.setValue(0);
		currentIndex = -10;
		clearEntries();
		
		//Gruppieren
		ArrayList<String> roadNumberList = new ArrayList<String>();
		for(Event event : eventList){
			if(!roadNumberList.contains(event.getRoadNumber())){
				//Falls die Autobahn noch nicht in der Liste ist -> hinzuf�gen
				roadNumberList.add(event.getRoadNumber());
			}
		}
		//Sortieren
		Collections.sort(roadNumberList);
		
		//Die Eintr�ge erzeugen
		for(String roadNumber : roadNumberList){
			entryList.add(new ListEntry(roadNumber));
		}
		
		//Die Eintr�ge anzeigen
		int y = 49;
		for(EntryPanel ep : entryList){
			if(entryList.indexOf(ep) >= 9) break; //Nur 9 Eintr�ge anzeigen 0 - 8 
			ep.setBounds(0, y, 518, entryHeight);
			y += entryHeight;
			container.add(ep);
		}
		
		//Die R�nder festlegen
		if(entryList.size() > 0){
			firstVisibleIndex = 0;
			if(entryList.size() > 9)
				lastVisibleIndex = 8;
			else
				lastVisibleIndex = entryList.size()-1;
		}
		else{
			firstVisibleIndex = lastVisibleIndex = 0;
		}
		
		showActiveEntry(); //<- reset der Buttons
		handleScrollBar();
	}
	
	@Override
	public void activateLastEntry() {
		if(currentIndex-1 >= 0){
			entryList.get(currentIndex).setInactive();
			entryList.get(currentIndex-1).setActive();
			
			currentIndex--;
			
			setScrollBarValue(currentIndex);
			
			if(entryList.size() > 9){ //Scrolling erforderlich
				if(currentIndex < firstVisibleIndex)
					scrollUp();
			}
			
			showActiveEntry();
			handleScrollBar();
		}
	}
	
	@Override
	public void activateNextEntry() {
		//Falls noch gar nix aktiv ist
		if(currentIndex < 0){
			entryList.get(0).setActive(); //TODO java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
			currentIndex = 0;
			showActiveEntry();
		}
		else if(currentIndex+1 < entryList.size()){
			entryList.get(currentIndex).setInactive();
			entryList.get(currentIndex+1).setActive();
			
			currentIndex++;
			
			setScrollBarValue(currentIndex);
			
			if(entryList.size() > 9){//Scrolling erforderlich!
				if(currentIndex > lastVisibleIndex)
					scrollDown();
			}
			
			showActiveEntry();
			handleScrollBar();
		}
	}

	@Override
	public void refresh(List<Event> eventList){
		//kann oft aufgerufen werden, von der Gui.update();
		//zu tun: aktives EntryPanel mit currentIndex extrahieren, da currentIndex beimneuen schreiben nicht mehr g�ltig ist
		//die active Entry l�schen, currentIndex zur�cksetzen, Eintr�ge l�schen
		//gruppieren, sortieren und entryList f�llen -> beim aktiven auf active setzen, currentIndex setzen falls es eins gab
		//wenn currentindex zwischen firstVisible und lastVisible -> normal darstellen und buttons setzen
		//wenn cI > lastVisible -> so darstellen, dass currentIndex ganz unten ist
		//wenn cI < firstVisible -> so darstellen, dass currentIndex ganz oben ist
		
		if(currentIndex >= 0){ //Es gibt ein aktives Element
			//Das aktive EntryPanel extrahieren
			EntryPanel activeEntry = entryList.get(currentIndex);
			
			//reset
			currentIndex = -10;
			entryList = new ArrayList<EntryPanel>();
			clearEntries();
			
			//Gruppieren
			ArrayList<String> roadNumberList = new ArrayList<String>();
			for(Event event : eventList){
				if(!roadNumberList.contains(event.getRoadNumber())){
					//Falls die Autobahn noch nicht in der Liste ist -> hinzuf�gen
					roadNumberList.add(event.getRoadNumber());
				}
			}
			//Sortieren
			Collections.sort(roadNumberList);
			
			//Die Eintr�ge erzeugen
			for(String roadNumber : roadNumberList){
				EntryPanel ep = new ListEntry(roadNumber);
				
				//Das aktive Panel wieder aktiv setzen ;)
				if(ep.equals(activeEntry)){
					ep.setActive();
					currentIndex = roadNumberList.indexOf(roadNumber);
				}
				entryList.add(ep);
			}
			
			//Die Eintr�ge darstellen
			showEntries();
			
			//Buttons setzen
			showActiveEntry();
			handleScrollBar();
		}
		else{ //Es gibt kein aktives Element -> Eintr�ge 0-(wenn vorhanden)8 anzeigen
			//Reset
			entryList = new ArrayList<EntryPanel>();
			clearEntries();
			
			//Gruppieren
			ArrayList<String> roadNumberList = new ArrayList<String>();
			for(Event event : eventList){
				if(!roadNumberList.contains(event.getRoadNumber())){
					//Falls die Autobahn noch nicht in der Liste ist -> hinzuf�gen
					roadNumberList.add(event.getRoadNumber());
				}
			}
			//Sortieren
			Collections.sort(roadNumberList);
			
			//Die Eintr�ge erzeugen
			for(String roadNumber : roadNumberList){
				entryList.add(new ListEntry(roadNumber));
			}
			
			//Die Eintr�ge anzeigen
			int y = 49;
			
			for(EntryPanel ep : entryList){//TODO java.util.ConcurrentModificationException
				if(entryList.indexOf(ep) >= 9) break; //Nur 9 Eintr�ge anzeigen 0 - 8 
				ep.setBounds(0, y, 518, entryHeight);
				y += entryHeight;
				container.add(ep);
			}
			
			//Die Eintr�ge darstellen
			showEntries();
			
			//Buttons r�cksetzen
			showActiveEntry();
			handleScrollBar();
		}
	}
	
	@Override 
	protected void showEntries(){
		//!!!!!!wird NUR von refresh() aufgerufen!!!!!!
		// falls sich currentIndex zwischen firstVisible - lastvisible befindet -> normal darstellen
		// sonst, solange scroll Up / scrolldown bis es sichtbar ist
		
		if(currentIndex >= 0 && entryList.size() > 9){ //Ein Element ist markiert und Scrolling wird ben�tigt
			if(firstVisibleIndex <= currentIndex && currentIndex <= lastVisibleIndex){ //es befindet sich im sichtbaren Bereich!
				int y = 49;
				for(int i=firstVisibleIndex; i<=lastVisibleIndex; i++){
					entryList.get(i).setBounds(0, y, 518, entryHeight);
					y += entryHeight;
					container.add(entryList.get(i));
				}
			}
			else if(lastVisibleIndex < currentIndex){ //so darstellen, dass der Index ganz  unten  ist
				int y = 49;
				for(int i=currentIndex-8; i<=currentIndex; i++){
					entryList.get(i).setBounds(0, y, 518, entryHeight);
					y += entryHeight;
					container.add(entryList.get(i));
				}
				firstVisibleIndex = currentIndex-8;
				lastVisibleIndex = currentIndex;
			}
			else if(currentIndex < firstVisibleIndex){ //so darstellen, dass der Index ganz  oben  ist
				int y = 49;
				for(int i=currentIndex; i<=currentIndex+8; i++){
					entryList.get(i).setBounds(0, y, 518, entryHeight);
					y += entryHeight;
					container.add(entryList.get(i));
				}
				firstVisibleIndex = currentIndex;
				lastVisibleIndex = currentIndex+8;
			}	
		}
		else{//Es ist nichts markiert!
			//Die Eintr�ge anzeigen
			int y = 49;
			
			for(EntryPanel ep : entryList){//TODO java.util.ConcurrentModificationException
				if(entryList.indexOf(ep) >= 9) break; //Nur 9 Eintr�ge anzeigen 0 - 8 
				ep.setBounds(0, y, 518, entryHeight);
				y += entryHeight;
				container.add(ep);
			}
			
			//Die R�nder festlegen
			if(entryList.size() > 0){
				firstVisibleIndex = 0;
				if(entryList.size() > 9)
					lastVisibleIndex = 8;
				else
					lastVisibleIndex = entryList.size()-1;
			}
			else{
				firstVisibleIndex = lastVisibleIndex = 0;
			}
		}
		
	}
	
	private void scrollUp(){
		clearEntries();
		int y = 49;
		firstVisibleIndex--;
		lastVisibleIndex--;
		
		for(int i=firstVisibleIndex; i<=lastVisibleIndex; i++){
			entryList.get(i).setBounds(0, y, 518, entryHeight);
			y += entryHeight;
			container.add(entryList.get(i));
		}
		
	}
	
	private void scrollDown(){
		clearEntries();
		int y = 49;
		firstVisibleIndex++;
		lastVisibleIndex++;
		
		for(int i=firstVisibleIndex; i<=lastVisibleIndex; i++){
			entryList.get(i).setBounds(0, y, 518, entryHeight);
			y += entryHeight;
			container.add(entryList.get(i));
		}
	}
	
	private void handleScrollBar(){
		scrollBar.setMaximum(entryList.size());
		if(entryList.size() > 9)
			scrollBar.setVisible(true);
		else
			scrollBar.setVisible(false);
	}
}

Kann mir bitte jemand sagen, wo ich das synchronized setzen muss - ok n bissle frech, euch n paar 100 zeilen code an den kopf zu werfen, aber versuchen kann mans ja ;)

gru� beni[/code]
 
J

jhjp

Gast
habs selbst gefunden: in der Gui.update() um currentState.refresh(eventList); und im keyListener um keyEvent(event.getKeyCode());

Wie kann man denn diesen Thread (also hier im Forum) als gelöst markieren?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JFrame problem mit Scrolling AWT, Swing, JavaFX & SWT 2
lumo SWT ScrolledComposite Smooth Scrolling AWT, Swing, JavaFX & SWT 2
E JPanel - Scrolling und Anzeigebug AWT, Swing, JavaFX & SWT 11
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
L JavaFX SelectionService selber implementieren AWT, Swing, JavaFX & SWT 7
ralfb1105 JavaFX AreaChart als DB Monitor implementieren AWT, Swing, JavaFX & SWT 11
D JavaFX Google API/OpenStreetMap in GUI implementieren AWT, Swing, JavaFX & SWT 1
Joker4632 JavaFX GridPane richtig implementieren AWT, Swing, JavaFX & SWT 7
Thallius Single Sign On in Java Implementieren AWT, Swing, JavaFX & SWT 6
L JavaFX StackedBar Implementieren? AWT, Swing, JavaFX & SWT 7
B GridLayout - wie am besten implementieren AWT, Swing, JavaFX & SWT 3
U Buttons schräg implementieren AWT, Swing, JavaFX & SWT 4
B mouseOnEntered ( Controller richtig implementieren) AWT, Swing, JavaFX & SWT 4
R AWT QuadratListener implementieren AWT, Swing, JavaFX & SWT 17
C In Hauptfenster Programm-Klassen implementieren AWT, Swing, JavaFX & SWT 9
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
E Swing JTextArea in JFrame, wie nun WindowFocusListener implementieren? AWT, Swing, JavaFX & SWT 2
S Swing Spiel Richtig/Falsch implementieren AWT, Swing, JavaFX & SWT 5
S TextArea ausgabe ohne JFrame zu implementieren AWT, Swing, JavaFX & SWT 2
S Swing JTextArea - Bild auf/ab Tasten implementieren AWT, Swing, JavaFX & SWT 4
H shell in view implementieren; menu mit keystroke unterlegen AWT, Swing, JavaFX & SWT 8
L SWT CLabel als Button implementieren? AWT, Swing, JavaFX & SWT 6
3TageBart Ebenen in Zeichen-Programm implementieren AWT, Swing, JavaFX & SWT 9
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
R setEnabled bei eigenem Widget implementieren? AWT, Swing, JavaFX & SWT 3
S Methoden implementieren AWT, Swing, JavaFX & SWT 7
B KeyListener implementieren AWT, Swing, JavaFX & SWT 3
F Welchen Listener implementieren? AWT, Swing, JavaFX & SWT 4
S Mehrsprachigkeit in GUI implementieren AWT, Swing, JavaFX & SWT 3
F Größenänderung mittels Maus - selbst implementieren? AWT, Swing, JavaFX & SWT 3
M ActionListener implementieren AWT, Swing, JavaFX & SWT 10
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
CptK JPanels übereinander legen AWT, Swing, JavaFX & SWT 6
CptK JPanels wechseln AWT, Swing, JavaFX & SWT 2
B Minimum x und y von Children-JPanels ermitteln AWT, Swing, JavaFX & SWT 3
L Swing JPanels werden nicht angezeigt! AWT, Swing, JavaFX & SWT 7
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
A Swing JPanels dynamisch untereinander einfügen AWT, Swing, JavaFX & SWT 3
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
R Swing JPanels auf JFrame auf verfügbaren Platz aufblasen AWT, Swing, JavaFX & SWT 4
C LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander. AWT, Swing, JavaFX & SWT 7
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
W Swing Farbige JPanels auf JFrame werden nicht gezeigt. Was mach ich falsch? AWT, Swing, JavaFX & SWT 7
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
F Swing JPanels übereinander ohne Mananger AWT, Swing, JavaFX & SWT 1
K Swing Klassenstruktur mit mehreren JPanels AWT, Swing, JavaFX & SWT 3
S Swing Navigation durch JPanels AWT, Swing, JavaFX & SWT 0
S Bei BoxLayout haben hinzugefügten Jpanels einen Versatz/Space AWT, Swing, JavaFX & SWT 0
B Größer-/Kleinerziehen eines JFrames/JPanels erkennen AWT, Swing, JavaFX & SWT 2
C Bei Btn Klick zwei JPanels switchen AWT, Swing, JavaFX & SWT 14
M Swing Aktualisieren eines JPanels nach Tasteneingabe AWT, Swing, JavaFX & SWT 2
S Liste von JPanels mit festen Höhen AWT, Swing, JavaFX & SWT 3
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
S Swing Kopie eines JPanels inkl. aller objekte darin erstellen AWT, Swing, JavaFX & SWT 5
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
F Event Handling Kommunikation eines JButton ueber JPanels hinaus AWT, Swing, JavaFX & SWT 6
S Swing Drag&Drop mit TransferHandler und JPanels AWT, Swing, JavaFX & SWT 8
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
A Swing Aktualisieren eines JPanels AWT, Swing, JavaFX & SWT 13
N Abspeichern eines kompletten JPanels AWT, Swing, JavaFX & SWT 57
S Swing Zwischenräume zwischen JPanels AWT, Swing, JavaFX & SWT 4
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
X zwischen 2 JPanels "elegant" wechseln AWT, Swing, JavaFX & SWT 3
S Swing MVC Ein JFrame, mehrere JPanels AWT, Swing, JavaFX & SWT 6
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
T jPanels im jFrame bewegen - Auch ohne Textfield? AWT, Swing, JavaFX & SWT 4
G ein JTextArea in zwei JPanels AWT, Swing, JavaFX & SWT 2
W Swing JFrame mit unterschiedlichen JPanels AWT, Swing, JavaFX & SWT 2
D Grafik über JPanels hinweg verschieben AWT, Swing, JavaFX & SWT 2
C klassenübergreifende JPanels auf ein JFrame AWT, Swing, JavaFX & SWT 22
X Alle Components eines JPanels Enablen AWT, Swing, JavaFX & SWT 7
D Swing Problem mit Gridbaglayout bzw. Größenanpassung JPanels AWT, Swing, JavaFX & SWT 7
P Swing Größe eines JPanels bestimmen (ohne Border!) AWT, Swing, JavaFX & SWT 2
0 Ausschnitt eines JPanels als Bild speichern AWT, Swing, JavaFX & SWT 4
N Richtiges einstellen der size von JPanels AWT, Swing, JavaFX & SWT 10
D LayoutManager JPanels ohne LayoutManager platzieren AWT, Swing, JavaFX & SWT 6
Weltall 7 Swing JPanels werden doppelt gezeichnet AWT, Swing, JavaFX & SWT 6
C Swing JList mit JPanels AWT, Swing, JavaFX & SWT 6
J Swing JPanels werden ständig gezeichnet AWT, Swing, JavaFX & SWT 11
C Swing Inhalt eines JPanels ermitteln & bearbeiten AWT, Swing, JavaFX & SWT 5
G Swing Komponenten dem Hintergrundbild des JPanels anpassen? AWT, Swing, JavaFX & SWT 6
N Swing GUI updaten / Aufklappbare Jpanels AWT, Swing, JavaFX & SWT 2
E Swing JPanels durch ziehen am Rand vergrößern/verkleinern?! AWT, Swing, JavaFX & SWT 2
buntuswalus Swing Datentransfer zwischen JPanels AWT, Swing, JavaFX & SWT 18
T Sichtbarmachen von Objekten auf mehreren JPanels AWT, Swing, JavaFX & SWT 2
J Swing Container innerhalb eines JPanels erfragen AWT, Swing, JavaFX & SWT 3
H Z-Order von JPanels in JFrames AWT, Swing, JavaFX & SWT 2
B Swing JFormattedTextField auf mehreren JPanels in einer JTabbedPane AWT, Swing, JavaFX & SWT 3
R Verschachtelte JPanels FocusTraversalPolicy AWT, Swing, JavaFX & SWT 6
L mehere JPanels auf JFrame - setVisible() funktioniert nicht AWT, Swing, JavaFX & SWT 3
J Swing JScrollPane fasst JPanel und Groesse des JPanels soll sich aendern AWT, Swing, JavaFX & SWT 2
H Größen von JPanels,JLable und JTextfield.. AWT, Swing, JavaFX & SWT 12
H Layoutprobleme mit Jpanels AWT, Swing, JavaFX & SWT 2
S Swing Dynamische JPanels: Vertikales Strecken verhindern AWT, Swing, JavaFX & SWT 4
Pithecanthropus Swing JPanels dynamisch austauschen AWT, Swing, JavaFX & SWT 8
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19

Ähnliche Java Themen

Neue Themen


Oben