JList mit Events Steuern ?

Status
Nicht offen für weitere Antworten.

vrcat

Mitglied
Hallo ich hoffe ihr könnt mir helfen. Mein Problem ist das ich eine JList gerne mittels Button hoch- und runterscrollen möchte. Das mit den Buttons und Events bekomme ich ja noch hin und dass ich bei der JList setAutoScroll flase setze, damit ich keinen Scrollbalken habe.
Wie kann ich aber nun der JListe sagen welche Elemente sichtbar sein müssen? (selber scrollen)
 
ohne es getestet zu haben: in der API findest Du die Methode JList#ensureIndexIsVisible
 
Hallo vrcat,

ich habe da auch nicht so ne grosse Ahnung, doch schau mal im thread glasspane,denke dies könnte ein Tipp für dich sein,

gruss Alex
 
Hmm das scheint nicht zu Funktionieren ich Poste mal mein Quellcode dan wird das Problem glaube verständlicher.

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 nun wird es verständlicher.
 
Nein nicht ganz ich will eigentlich nur die Einträge in der JList hoch und runter scrollen so wie man das mit dem Scrollbar machen kann nur möchte (muss) ich dafür buttons nehmen die oben und untern an der Listbat zu sehen sind.
 
Ach, die Einträge an sich - nicht die Markierung ?

Sprich du hast Entry1 markiert, drückst auf den ">>" Button und nun steht Entry2 an Position 1 und Entry1 an der Position 2 ?

Dazu müsstest du erst kontrollieren ob du nicht schon am Ende bist (weil du dann ja nicht mehr "verschieben" kannst) - also den Index des ausgewählten Elements holen.

Aber vielleicht kannst du auch erstmal antworten ob es das ist was du willst bevor ich hier weiter ***** poste 😉
 
Salute,

also mit

Code:
if ("runter".equals(arg0.getActionCommand()))
{
    list.setSelectedIndex(list.getSelectedIndex()+1);
}
else if("rauf".equals(arg0.getActionCommand()))
{
    list.setSelectedIndex(list.getSelectedIndex()-1); 
}

kannst Du zwar rauf und runter bei dein einzelnen Elementen, doch habe nicht herausgefunden wie du den focus veränderst, damit wenn du ausserhalb des sichtbaren Bereichs den sichtbarenbereich verändern kannst.

Sorry, denke wirst dies ja auch schon wissen was ich dir geschrieben habe...

gruss Alex
 
du musst ja sowieso vorher kontrollieren ob du schon am Anfang / Ende bist, da du sonst versuchst einen nicht vorhandenen Index zu selektieren.

außerdem glaube ich - dass er nicht das machen wollte - da das in dem text von sun oben drüber beschrieben steht...
 
Hmm kann garnicht glauben was sich alles aus so einer Fagestellung ergben kann 😀 .

Ich versuchs nochmal:

1. Also am anfang ist die Liste mit 10 Einträgen
2. Mann kann aber nur 5 Einträge sehen da die Liste nicht so gross ist um alle zu sehen
bsp.
In der Liste Sichtbar:
Entry1
Entry2
Entry3
Entry4
Entry5

3. Nun will kucken was noch so in der Liste ist also drücke ich unten auf den Button "<<"
4. Nun soll sich die Anzeige der Elemente ändern
bsp.
In der Liste Sichtbare Elemente nach dem Drücken:
Entry2
Entry3
Entry4
Entry5
Entry6

5. und so weiter halt wenn mann auf ">>" drückt soll es dann andersrum funktionieren.


Hoffe diesmal habe ich mich besser ausgedrückt.
 
Das Verhalten, welches Du bauen willst entspricht also einer normalen JScrollBar!?
Warum arbeitest Du nicht damit sondern mit deiner Button-Lösung???
 
Probier mal den Code vom Sun Tut mit folgendem Listener:

Code:
    class UpDownListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int moveMe = list.getFirstVisibleIndex();

            if (e.getActionCommand().equals(upString)) {
                if (moveMe != 0) {  
                	list.ensureIndexIsVisible(moveMe-1);  
                }
            } else {
					int newPos = moveMe + list.getVisibleRowCount();
               if (newPos <= listModel.getSize()-1) {
						list.ensureIndexIsVisible(newPos);
					}
            }
        }
    }
 
Ja genau, also das liegt darin begrundet das es später nicht soviel Platz auf der Oberfläche gibt. Durch die Button's sieht es aber recht ordentlich aus nun muss es halt nur noch Funktionieren.
(PDA-Auflösung)

@mic_checker: Kannst mir mal den Link von diesem Tutorial geben ?
 
Ansonsten geht es auch, wenn Du das ganze in ein JScrollpane packst und die Methode scrollRectToVisble verwendest:

Code:
class ListExample extends JFrame implements ActionListener {

  private JList list = null;
  private int pos = 0;

  public ListExample() {
    setTitle( "ListExample" );
    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 );
    JPanel p= new JPanel();
    list.setVisibleRowCount(5);
    p.setLayout( new BorderLayout() );
    JButton btn1 = new JButton( ">>" );
    JButton btn2 = new JButton( "<<" );
    p.add( btn1, BorderLayout.NORTH );
    p.add( btn2, BorderLayout.SOUTH );
    p.add( new JScrollPane( list, JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ), BorderLayout.CENTER );
    btn1.addActionListener( this );
    btn2.addActionListener( this );
    getContentPane().add(p);
    setVisible( true );
    pack();
  }

  public void actionPerformed( ActionEvent arg0 ) {
    int min = 0;
    int max = list.getModel().getSize()-list.getVisibleRowCount();

    if ( ">>".equals(arg0.getActionCommand())) {
      pos--;
    } else {
      pos++;
    }

    if ( pos < min) pos = min;
    if ( pos >= max) pos = max;

    list.scrollRectToVisible(list.getCellBounds(pos,pos+4));
  }

  public static void main( String[] args ) {
    new ListExample();
  }

}
 
Hallo sky80 ja das geht auch habs leider zu spät gesehen habe mir nun ne eigene Klasse ExList geschrieben mit der das soweit alles geht was ich brauche.

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 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);
	}	
}

Also nochmal danke an alle für eure Hilfe.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben