JScrollPane scrollt nicht nach unten

Status
Nicht offen für weitere Antworten.

0001001

Bekanntes Mitglied
Folgendes Problem:

Ich habe eine JTable in einer JScrollPane. Mit der Anweisung
Code:
scrollpane.getVerticalScrollBar().setValue(scrollpane.getVerticalScrollBar().getMaximum());
kann man die JScrollPane anweisen, nach ganz unten zu scrollen. Das funktioniert auch in den meisten Fällen.

In folgendem Fall scrollt die JScrollPane aber nur ein wenig, aber nicht bis ganz unten.
Es muss irgendetwas mit dem CellRenderer zu tun haben, der die Aufgabe hat, in einer Zelle sowohl ein Bild als auch einen Text anzuzeigen. Denn wenn nur Text angezeigt wird, dann scrollt die JScrollPane problemlos bis nach ganz unten.

Das Ganze sieht dann so aus:
demo.png


Kann mir jemand sagen, wieso die JScrollPane nicht bis ganz unten scrollt?

Hab die Klasse mal hier hochgeladen:
http://timeline1.ti.funpic.de/src.zip

Hier auch nochmal der Quellcode:

Test Klasse:
Code:
public class TimeLineTest extends JFrame{
	TimeLine timeline;
	
	public TimeLineTest(){
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(new BorderLayout());
		
		timeline = new TimeLine(5,10,true);
		JScrollPane scrollpane = new JScrollPane(timeline);
		
		this.add(scrollpane,BorderLayout.CENTER);
		
		addData();		

		this.pack();
		this.setSize(600,400);
		this.setVisible(true);

		// scroll down
		scrollpane.getVerticalScrollBar().setValue(scrollpane.getVerticalScrollBar().getMaximum());
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater (new Runnable(){	
			public void run ()	{
				new TimeLineTest();
			}
		});	
	}
	
	private void addData(){		
		for(int i=0;i<5;i++){
			ArrayList<Object[]> columndata = new ArrayList<Object[]>();
			int random = (int)(Math.random() * 40) + 2;
			for(int j=0;j<random;j++){				
				columndata.add(new Object[]{"Bildtext",new ImageIcon(this.getClass().getResource("image1.png"))});				
			}
			timeline.addColumn("Spalte", columndata);
		}
	}
}

Modifizierte JTable:
Code:
public class TimeLine extends JTable{
	private ImageTableModel itm;			// table model
	private int maxRowHeight = 55;			// maximum row height


	/**
	 * Generates a new TimeLine object
	 * @param rows	- number of rows of the default grid
	 * @param columns - number of columns of the default grid
	 * @param autoSizeRowHeight	- auto adjust row height to the max row height
	 * @param autoSizeColumnWidth - auto adjust column width
	 */
	public TimeLine(int rows, int columns, boolean autoSizeRowHeight){
		this.setTableHeader(null);
		this.setDefaultRenderer(Object.class, new MyCellRenderer(this)); 

		itm = new ImageTableModel();
		itm.initGrid(rows, columns);

		setModel(itm);	// set the table model
	}

	
	/**
	 * Adds a new column to the table
	 * @param columnName - The column name
	 * @param columndata - The row values for this column. 
	 * Object[0] contains the cell text, object[1] contains the ImageIcon
	 */
	public void addColumn(String columnName, ArrayList<Object[]> columndata){
		itm.addColumn(columnName, columndata);
	}

	
	/**
	 *	Cell renderer for this table
	 */
	class MyCellRenderer extends DefaultTableCellRenderer{
		private TimeLine theTimeLine;
		public MyCellRenderer(TimeLine timeline){
			this.theTimeLine = timeline;
			setHorizontalAlignment( CENTER );
			setVerticalTextPosition(JLabel.BOTTOM);
			setHorizontalTextPosition(JLabel.CENTER);			
		}

		public void setValue(Object value) {
			Object[] a = (Object[])value;
			if(value == null){			// empty cell
				setIcon(null);
				super.setValue(value);				
			}
			else if (a[1] instanceof Icon) {		// normal cell with text and image
				setIcon((Icon) a[1]);
				setText((String)a[0]);
				this.setAlignmentY(JLabel.BOTTOM_ALIGNMENT);
				theTimeLine.setRowHeight(maxRowHeight);
			} 
			else if(a[1] == null && a[0] instanceof String){
				setText((String)a[0]);
				setIcon(null);
			}
			else {
				setIcon(null);
				super.setValue(value);
			}
		}
	}



	/**
	 * The table model for this timeline	 *
	 */
	class ImageTableModel extends AbstractTableModel{
		private ArrayList<String> columnnames; // holds the column names
		private ArrayList<ArrayList<Object[]>> data; // holds the table data
		private int maxRowCount;	
		private int columnCursor; // points on the current column

		public ImageTableModel(){
			columnnames = new ArrayList<String>();
			data = new ArrayList<ArrayList<Object[]>>();
			maxRowCount = 0;
			columnCursor = 0;
		}

		public Object getValueAt(int row, int column){
			if (data.get(column).size()-1<row){
				return null;
			}
			else{
				return data.get(column).get(row);
			}			
		} 

		public int getRowCount(){
			return maxRowCount;
		} 

		public int getColumnCount(){
			return columnnames.size();
		}

		public String getColumnName( int columnIndex ){
			return columnnames.get(columnIndex);
		}

		/**
		 * Adds a new column to the table
		 * @param columnName - The column name
		 * @param columndata - The row values for this column.
		 */
		public void addColumn(String columnName, ArrayList<Object[]> columndata){
			if(columnCursor >= columnnames.size()){
				columnnames.add(columnName);
				data.add(rotateFillList(columnName,columndata));
			}
			else{
				columnnames.set(columnCursor, columnName);
				data.set(columnCursor, rotateFillList(columnName,columndata));
			}
			SwingUtilities.invokeLater (new Runnable(){		// fixes a nasty java vector bug
				public void run ()	{
					fireTableStructureChanged();
					fireTableDataChanged();	
				}
			});
			columnCursor++;
		}

		public void initGrid(int rows, int columns){
			for(int i=0;i<columns;i++){
				ArrayList<Object[]> newdata = new ArrayList<Object[]>();
				for(int j=0;j<rows;j++){
					newdata.add(null);
				}
				columnnames.add(String.valueOf(i));
				data.add(newdata);
				maxRowCount = rows;
			}
			SwingUtilities.invokeLater (new Runnable(){		// fixes a nasty java vector bug
				public void run ()	{
					fireTableStructureChanged();
					fireTableDataChanged();	
				}
			});
		}

		/**
		 * Rotates the list. If list.size() is smaller than
		 * maxRowCount the list if filled with null values
		 * This generates the bottom up effect
		 * @param columnName - The column name
		 * @param list
		 * @return list
		 */
		private ArrayList<Object[]> rotateFillList(String columnName, ArrayList<Object[]> list){
			list.add(0,new Object[]{columnName,null});	// set column name to be on the bottom 

			if(maxRowCount < list.size()){
				// adjust all rows to the new maxRowCount
				maxRowCount = list.size();
				for(int i=0;i<data.size();i++){
					int diff = maxRowCount - data.get(i).size();
					for(int j=0;j<diff;j++){
						data.get(i).add(0,null);
					}
				}				
			}
			else {	// fill with null values
				int diff = maxRowCount - list.size();
				for(int i=0;i<diff;i++){
					list.add(null);
				}
			}

			ArrayList<Object[]> rotatedList = new ArrayList<Object[]>();
			for(int i= list.size()-1;i>=0;i--){		// rotate list
				rotatedList.add(list.get(i));
			}

			return rotatedList;
		}
	}	
}
 

Ariol

Top Contributor
Code:
import java.awt.BorderLayout;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class TimeLineTest extends JFrame
{
	TimeLine	timeline;

	public TimeLineTest(){
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(new BorderLayout());
		
		timeline = new TimeLine(5,10,true);
		final JScrollPane scrollpane = new JScrollPane(timeline);
		
		this.add(scrollpane,BorderLayout.CENTER);
		
		addData();		

		this.pack();
		this.setSize(600,400);
		this.setVisible(true);

		SwingUtilities.invokeLater (new Runnable(){	
			public void run ()	
			{
				scrollpane.getVerticalScrollBar().setValue(scrollpane.getVerticalScrollBar().getMaximum());
			}
		});
	}

	public static void main(String[] args)
	{

		new TimeLineTest();

	}

	private void addData()
	{
		for (int i = 0; i < 5; i++)
		{
			ArrayList<Object[]> columndata = new ArrayList<Object[]>();
			int random = (int) (Math.random() * 40) + 2;
			for (int j = 0; j < random; j++)
			{
				columndata.add(new Object[]
				{ "Bildtext", new ImageIcon(this.getClass().getResource("image1.png")) });
			}
			timeline.addColumn("Spalte", columndata);
		}
	}
}

Das invokeLater in der main-Methode macht meiner Ansicht nach enig Sinn...
 

Marco13

Top Contributor
Ne, das invokeLater zu verwenden, um sein Fenster zu bauen und anzuzeigen ist eigentlich schon richtig. Und dazu, dass die ScrollPane manchmal erst verzögert ihre wahre Größe kennt, auch: http://www.java-forum.org/de/viewtopic.php?p=434845

Also, das invokeLater in der main sollte bleiben, und zusätzlich noch
Code:
SwingUtilities.invokeLater (new Runnable(){   
         public void run ()   
         {
            scrollpane.getVerticalScrollBar().setValue(scrollpane.getVerticalScrollBar().getMaximum());
         }
      });
im Konstruktor - obwohl das IMHO nicht notwendig sein sollte - vielleicht weil das eigentliche "validaten" erst ausgeführt wird, nachdem alle Events abgearbeitet sind - das grenzt IMHO schon fast an einen bug ... naja :?
 

0001001

Bekanntes Mitglied
Mit dem invokeLater hat das nichts zu tun.
Was ich bisher herausgefunden habe ist, dass es an der Zeile
Code:
heTimeLine.setRowHeight(maxRowHeight);
liegt.

Anscheinend mag Java es gar nicht, wenn man im CellRenderer die Höhe der Zeile festlegt.
 

Marco13

Top Contributor
Ohja, da bin ich auch drüber gestolpert. Hatte die setValue-Methode zwar durch die Methode ersetzt, wo das eigentlich drinstehen sollte (nämlich getTableCellRendererComponent), und auch die rowheight ist mir aufgefallen und ich hatte kurz geschaut, ob's vielleicht daran liegt, aber dass die in setValue verwendet wird hatte ich übersehen. Aber wenn man die row height im Konstruktor setzt, geht's doch?!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
L JScrollPane scrollt nicht !! AWT, Swing, JavaFX & SWT 3
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
R JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 5
D JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 2
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
H JTable in JScrollPane scrollt vertikal, nicht horizontal AWT, Swing, JavaFX & SWT 5
B JscrollPane scrollt nicht nach links oder oben AWT, Swing, JavaFX & SWT 3
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
P Swing JScrollPane scrollt nur horizontal AWT, Swing, JavaFX & SWT 2
G JScrollPane scrollt zu langsam AWT, Swing, JavaFX & SWT 6
G JScrollPane scrollt nach Neuzeichnen von selber AWT, Swing, JavaFX & SWT 2
S Wie scrollt JScrollPane zu dem makierten Eintrag der JList? AWT, Swing, JavaFX & SWT 3
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
N Swing JScrollPane mit Tastatur bedienen? AWT, Swing, JavaFX & SWT 0
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
MaxG. Swing JScrollPane AWT, Swing, JavaFX & SWT 10
Soloeco Swing JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
Bluedaishi JScrollpane AWT, Swing, JavaFX & SWT 0
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
F JTable mit JScrollPane AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A JScrollPane - ScrollBar Buttongröße verändern AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
A Swing JScrollPane Problem AWT, Swing, JavaFX & SWT 6
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane in JScrollPane - Problem AWT, Swing, JavaFX & SWT 3
K Bug in JScrollPane? AWT, Swing, JavaFX & SWT 4
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
V LayoutManager JScrollPane verwirft Elementanordnung AWT, Swing, JavaFX & SWT 3
B JScrollPane Problem AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane AWT, Swing, JavaFX & SWT 7
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
B JScrollPane Horizontal klappt nicht. AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Swing Korrekte JTable.rowAt(point) für JTable in JScrollPane AWT, Swing, JavaFX & SWT 5
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
S JScrollPane reagiert nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane zu JTable hinzufügen AWT, Swing, JavaFX & SWT 16
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8
P Swing JScrollpane AWT, Swing, JavaFX & SWT 2
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
J JScrollPane Probleme AWT, Swing, JavaFX & SWT 3
S Swing JScrollPane verliert Scrollbars AWT, Swing, JavaFX & SWT 5
D Swing JTable in JScrollpane beliebig verbreitern AWT, Swing, JavaFX & SWT 5
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
J Swing Unteren Abstand für JTable in JScrollPane festlegen AWT, Swing, JavaFX & SWT 10
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
M JScrollPane Problem AWT, Swing, JavaFX & SWT 6
S Swing JScrollpane und ViewPort AWT, Swing, JavaFX & SWT 4
D JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 12
X JScrollPane funzt net... AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben