JList Scrollen ?

vrcat

Mitglied
Hallo ich hoffe ihr könnt mir helfen ich versche gerade eine JList mittels Button zu Scrollen. Jedoch will sie nicht so wie ich will.
Hir mal der Quelltext:

Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class ListExample extends JFrame implements ActionListener {

   private JList list = null;
   
   public ListExample(){
      setTitle("ListExample");
      setSize(150,250);
            
      String[]    entries = { "Entry 1", "Entry 2", "Entry 3",
                        "Entry 4", "Entry 5", "Entry 6",
                        "Entry 7", "Entry 8", "Entry 9",
                        "Entry10", "Entry11", "Entry12",
                        "Entry13", "Entry14", "Entry15",
                        "Entry16", "Entry17", "Entry18",
                        "Entry19", "Entry20", "Entry21",
                        "Entry22", "Entry23", "Entry24"};
      
      list = new JList(entries);      
      list.setLayout(new BorderLayout());
      JPanel p;
      list.add(p = new JPanel());
      p.setOpaque(false);
      p.setLayout(new BorderLayout());
      JButton btn1,btn2;
      p.add(btn1 = new JButton(">>"),BorderLayout.NORTH);
      p.add(btn2 = new JButton("<<"),BorderLayout.SOUTH);
      btn1.addActionListener(this);
      btn2.addActionListener(this);
      
      getContentPane().add(list);
      setVisible(true);
   }
   
   public void actionPerformed(ActionEvent arg0) {
      list.ensureIndexIsVisible(14);      
   }
   
   public static void main(String[] args){
      new ListExample();
   }

}

Hoffe ihr könnt mir helfen oder einen Tip geben wie man es vieleicht auch anders machen kann.
 
Hi!
Eine JList ist von alleine nicht scrollable. Du musst sie z.B. die Liste als Viewport eines JScrollpane machen.. d.h. insbesondere
Code:
list.ensureIndexIsVisible(14);
funktioniert auch nur dann.
Um die liste bei einer scrollpane zu registieren:
Code:
JScrollPane scrollPane = new JScrollPane(liste);
dann sollte es eigentlich funktionieren.


*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Ja das Funktioniert nur jetzt habe ich das problem das ich die ScrollBars angezeigt bekomme wie bekomme ich die ausgeblendet ?
 
Code:
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
 
Das würd ich mit
Code:
scrollpane.setCorner(String corner, JButton button);
probieren
 
Okay es scheint keine einfache lösung dafür zu geben also habe ich mir ne eigene Klasse ExList geschrieben für interessierte hänge ich sie mal ran. Danke nochmal für die Hilfe.

Code:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;


public class ExList extends JList implements ActionListener {

	private static final long serialVersionUID = 1L;
	
	private int					aktIndex    =    0;
	private JButton				btn1,btn2   = null;
	private ArrayList		 	elementList	= null;
	private DefaultListModel 	model 		= null;

	public ExList(){
		model 		= new DefaultListModel();
		elementList = new ArrayList();
		setModel(model);
		setLayout(new BorderLayout());
		add(btn1 = new JButton(">>"),BorderLayout.NORTH);
		add(btn2 = new JButton("<<"),BorderLayout.SOUTH);
		btn1.setOpaque(false);
		btn1.setVisible(false);
		btn1.setFocusable(false);
		btn1.addActionListener(this);
		btn1.setBorder(BorderFactory.createEmptyBorder());
		btn2.setOpaque(false);
		btn2.setVisible(false);
		btn2.setFocusable(false);
		btn2.addActionListener(this);
		btn2.setBorder(BorderFactory.createEmptyBorder());		
	}
	
	public void add(String s){
		elementList.add(elementList.size(),s);	
		updateModel();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource()==btn1) 		aktIndex--;
		else if (e.getSource()==btn2) 	aktIndex++; 
		updateModel();	
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if (getHeight()>getCellBounds(0,0).height*model.size())
			btn2.setVisible(false); else btn2.setVisible(true);		
	}
	
	private void updateModel(){
		model.removeAllElements();
		for (int z=0, i=aktIndex;i<elementList.size();i++, z++)
			model.add(z,elementList.get(i));
		if (aktIndex>0) btn1.setVisible(true); else btn1.setVisible(false);
	}	
}
 
Zurück