# ScrollPane Anpassungen



## dweiner (19. Okt 2008)

Hallo, 
ich habe eine ScrollPane, in der der darin platzierte Text mehr Platz braucht als ich habe und somit die Scrollbalken ins Spiel kommen. Mein Problem ist aber, dass die Scrollbalken dann nach unten scrollen. Ich möchte die Balken aber von Anfang an oben haben. Wie mache ich das? Ich habs versucht mit, funktioniert aber nicht:

JScrollPane scrollpane = new JScrollPane(bla);
scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);


Noch was anderes: in meiner ScrollPane zeige ich eine JList an. Wie kann ich die Elemente der JList in der ScrollPane zentriert anzeigen lassen, bei mir wirds zur Zeit am linken Rand angezeigt....

Danke schon mal im voraus!

Gruß
Dominik


----------



## Gast (19. Okt 2008)

Frage 1: Du rufst nach Einfügen der Elemente in die Liste das auf:

```
JScrollPane pane = new JScrollPane();
pane.getVerticalScrollBar().setValue(pane.getVerticalScrollBar().getMinimum());
```

Frage 2: Das kannst du über den ListCellRenderer festlegen.
Beispiel:

```
JList list = new JList();		
		list.setCellRenderer(new MyListCellRenderer());

	}
	class MyListCellRenderer extends DefaultListCellRenderer {
		public MyListCellRenderer(){
			this.setHorizontalTextPosition(CENTER);
		}

		public Component getListCellRendererComponent( JList list, Object value, int index,boolean isSelected, boolean cellHasFocus) {
			setText((String)value);
			return this ;
		}	
	}
```


----------



## dweiner (20. Okt 2008)

Hallo, 

danke schon mal für deine Antwortvorschläge! 
Ich habe soeben beide ausprobiert und leider funktionieren bei mir deine beiden Vorschläge NICHT! Eigentlich komisch - deine Antworten sehen eigentlich schon plausibel aus......

Könntest du mir da (oder jemand anderes) nochmal auf die Sprünge helfen?

1) Scrollbalken oben anfangen, wenn der Text darin zu lang ist...
2) Elemente einer JList oder TextArea in einem ScrollPane zentriert anzeigen lassen..

Danke nochmal!


Gruß
Dominik


----------



## Gast (20. Okt 2008)

Mach doch einfach eine kleine lauffähige Demo die das Problem zeigt. Ich hab beide Codeschnipsel bei mir korrekt am laufen.


----------



## dweiner (21. Okt 2008)

Hi, 

ich hab hier mal eine kleine Demo gebastelt. Komisch, die Sache mit den oben beginnenden Scrollbalken wird hier direkt korrekt gemacht - also ohne irgendwelche Zuweisungen, während es in meinem eigentlichen Programm nicht mal mit "VerticalScrollPane" etc. funktionierte.....

Desweiteren sollte noch die Schrift im zweiten ScrollPane zentriert angezeigt werden.

Hier mal mein Demo-Code:

```
import java.awt.BorderLayout;

import java.awt.Dimension;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.JEditorPane;
import javax.swing.JFrame;

import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class Test {
	
	private JFrame frame;
	private JEditorPane infoArea;
	private String text;
	private JList list;
	
	public Test(){
		
			
			frame = new JFrame();
			frame.setAlwaysOnTop(true);
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setLocationByPlatform(true);

			
			//bei diesem ScrollPane sollte der Scrollbalken oben beginnen
			JScrollPane scrollPane = new JScrollPane(infoArea = new JEditorPane());
			scrollPane.setMinimumSize(new Dimension(50, 30));
			scrollPane.setPreferredSize(new Dimension(50,30));

		
			
			
			text = "<html>[b]Sie sehen nun den Bildschirm eines Marktexperiments. Ganz oben sehen " +
					"Sie, dass Sie sich in einem Testdurchgang befinden. In der Ecke rechts oben sehen Sie " +
					"einen kleinen Kasten mit der verbleibenden Zeit in Sekunden. Sie handeln mit den anderen Spielern " +
					"in Ihrem Markt jeweils 120 Sekunden an einem Stück. Ist diese Zeit abgelaufen, so verlassen alle " +
					"Spieler den Handelsbildschirm automatisch. Für diesen Testdurchgang haben wir die Zeit auf " +
					"500 Sekunden ausgeweitet, damit Sie genügend Zeit haben die einzelnen Bildschirmelemente " +
					"kennen zu lernen.

Bitte klicken Sie auf OK</p>" +
					"[/b]</html>";
			
			infoArea.setText(text);	
			infoArea.setFont(new Font("Dialog", Font.BOLD, 44));
			
			
			// in diesem ScrollPane befindet sich eine JList, bei der der Text zentriert ausgegeben werden soll
			JScrollPane ScrollPane2 = new JScrollPane(list = new JList());
			ScrollPane2.setPreferredSize(new Dimension(50, 30));
			ScrollPane2.setMaximumSize(new Dimension(50, 30));
			
			String [] data = new String[1];
			data[0] = "Hallo";
			list.setListData(data);
			
			JPanel panel = new JPanel();
			panel.setLayout(new BorderLayout());
			panel.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
			panel.add(scrollPane, BorderLayout.CENTER);
			panel.add(ScrollPane2, BorderLayout.SOUTH);
```


Danke schon mal im voraus für deine Hilfe!

Gruß
Dominik


----------



## Guest (21. Okt 2008)

Ok, ne lauffähige Demo ist was anderes aber hier eine mögliche Lösung zu erstem Problem:

```
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class Demo {

	private JFrame frame;
	private JEditorPane infoArea;
	private String text;
	private JList list;
	JScrollPane scrollPane;

	public Demo(){


		frame = new JFrame();
		frame.setAlwaysOnTop(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationByPlatform(true);


		//bei diesem ScrollPane sollte der Scrollbalken oben beginnen
		infoArea = new JEditorPane();
		scrollPane = new JScrollPane(infoArea);
		scrollPane.setMinimumSize(new Dimension(50, 30));
		scrollPane.setPreferredSize(new Dimension(50,30));


		text = "<html>[b]Sie sehen nun den Bildschirm eines Marktexperiments. Ganz oben sehen " +
		"Sie, dass Sie sich in einem Testdurchgang befinden. In der Ecke rechts oben sehen Sie " +
		"einen kleinen Kasten mit der verbleibenden Zeit in Sekunden. Sie handeln mit den anderen Spielern " +
		"in Ihrem Markt jeweils 120 Sekunden an einem Stück. Ist diese Zeit abgelaufen, so verlassen alle " +
		"Spieler den Handelsbildschirm automatisch. Für diesen Testdurchgang haben wir die Zeit auf " +
		"500 Sekunden ausgeweitet, damit Sie genügend Zeit haben die einzelnen Bildschirmelemente " +
		"kennen zu lernen.

Bitte klicken Sie auf OK</p>" +
		"[/b]</html>";

		infoArea.setText(text);   
		infoArea.setFont(new Font("Dialog", Font.BOLD, 44));

		frame.getContentPane().add(scrollPane);
		frame.pack();
		frame.setSize(800, 600);
		frame.setVisible(true);		
		
		Thread t = new Thread(){
			public void run(){
				scrollPane.getVerticalScrollBar().setValue(0);
			}
		};
		t.start();
	}
	
	

	public static void main(String[] argv){
		SwingUtilities.invokeLater(new Runnable(){
			public void run(){
				Demo d=new Demo();
			}
		});
	}
}
```


----------



## Guest (21. Okt 2008)

Eine Lösung für das zweite Problem:

```
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class Demo {

	private JFrame frame;
	private JEditorPane infoArea;
	private String text;
	private JList list;
	JScrollPane scrollPane;

	public Demo(){


		frame = new JFrame();
		frame.setAlwaysOnTop(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationByPlatform(true);


		list = new JList();
        // in diesem ScrollPane befindet sich eine JList, bei der der Text zentriert ausgegeben werden soll
        JScrollPane scrollPane2 = new JScrollPane(list);
        scrollPane2.setPreferredSize(new Dimension(50, 30));
        scrollPane2.setMaximumSize(new Dimension(50, 30));
        
        String [] data = new String[1];
        data[0] = "Hallo";
        list.setListData(data); 
        list.setCellRenderer(new MyListCellRenderer());


		frame.getContentPane().add(scrollPane2);
		frame.pack();
		frame.setSize(800, 600);
		frame.setVisible(true);				
	}
	
   class MyListCellRenderer extends DefaultListCellRenderer {
	      public MyListCellRenderer(){
	         this.setHorizontalAlignment(JLabel.CENTER);
	      }

	      public Component getListCellRendererComponent( JList list, Object value, int index,boolean isSelected, boolean cellHasFocus) {
	         setText((String)value);
	         return this ;
	      }   
	   } 

	public static void main(String[] argv){
		SwingUtilities.invokeLater(new Runnable(){
			public void run(){
				Demo d=new Demo();
			}
		});
	}
}
```

Sorry für die kleinen Fehler, die sich bei meiner ersten Lösung eingeschlichen hatten =)


----------



## dweiner (22. Okt 2008)

Klasse, danke dir - ich werde es nachher bei mir ausprobieren.....


----------

