JList mit JSpinner

hansmueller

Mitglied
Hallo,

ich möchte eine JList erstellen, in der JSpinner vorhanden sind.

Hintergrund:
Ich möchte eine Liste erstellen die verschiedene Einträge enthält (dafür sind Listen ja da ).
Jeder Eintrag kann aus einem oder mehreren Artikeln bestehen.
Bei manchen dieser Artikel soll man die Anzahl ändern können.

Ich habe hier ein kleines kompilierbares Beispielprogramm zum Testen geschrieben:

Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.ListCellRenderer;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;


public class MainProg
{
	JFrame f;
		
	public static void main(String[] args)
	{
		MainProg x = new MainProg();

	}
	
	public MainProg()
	{
		f = new JFrame("Test Auswahlpanel");
		
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		f.setLayout(new GridLayout(1, 2));
		f.setPreferredSize(new Dimension(600, 300));
				
		DefaultListModel StandardListenModel = new DefaultListModel();
				
		ListenEintrag le1 = new ListenEintrag("Test 1","Versuch 1","Irrtum 1",5);
		ListenEintrag le2 = new ListenEintrag("Test 2","Versuch 2",null,null);
		ListenEintrag le3 = new ListenEintrag("Test 3","Versuch 3",null,25);
		ListenEintrag le4 = new ListenEintrag("Test 4","Versuch 4","Irrtum 4",null);
					
		StandardListenModel.addElement(le1);
		StandardListenModel.addElement(le2);
		StandardListenModel.addElement(le3);
		StandardListenModel.addElement(le4);
				
		JList Liste = new JList(StandardListenModel);
		
		Liste.setCellRenderer(new MeinCellRenderer());
		
		
		f.add(new JScrollPane(Liste));
						
		f.pack();
		f.setVisible(true);
		
	}
	
	
	public class ListenEintrag
	{
		private String s1,s2,s3;
		private Integer i1;
		
		public ListenEintrag(String p_s1, String p_s2, String p_s3, Integer p_i1)
		{
			this.s1 = p_s1;
			this.s2 = p_s2;
			this.s3 = p_s3;
			this.i1 = p_i1;
		}

		public String getS1()
		{
			return s1;
		}

		public String getS2()
		{
			return s2;
		}

		public String getS3()
		{
			return s3;
		}

		public Integer geti1()
		{
			return i1;
		}

	}
	
	
	public class MeinCellRenderer extends JPanel implements ListCellRenderer
	{
		JLabel lb1,lb2,lb3,lb4;
		JSpinner sp1;
		
		public MeinCellRenderer()
		{
			setBorder(BorderFactory.createLineBorder(Color.MAGENTA, 3));
			setOpaque(true);
			
			lb1 = new JLabel();
			lb2 = new JLabel();
			lb3 = new JLabel();
						
			sp1 = new JSpinner(new SpinnerNumberModel(30,0,100,1));
				
			
			lb1.setPreferredSize(new Dimension(100, 2));
			
			lb1.setOpaque(false);
			lb2.setOpaque(false);
			lb3.setOpaque(false);
			sp1.setOpaque(false);
			
			
			lb1.setBorder(BorderFactory.createLineBorder(Color.PINK, 2));
			lb2.setBorder(BorderFactory.createLineBorder(Color.PINK, 2));
			lb3.setBorder(BorderFactory.createLineBorder(Color.PINK, 2));
			sp1.setBorder(BorderFactory.createLineBorder(Color.PINK, 2));
			
			GroupLayout gl = new GroupLayout(this);
			setLayout(gl);
			
			gl.setHorizontalGroup(gl.createSequentialGroup()
					.addGroup(gl.createParallelGroup()
							.addComponent(lb1)
							.addComponent(lb3))
					.addGroup(gl.createParallelGroup()
							.addComponent(lb2)
							.addComponent(sp1))
					);
			
			gl.setVerticalGroup(gl.createSequentialGroup()
					.addGroup(gl.createParallelGroup()
							.addComponent(lb1)
							.addComponent(lb2))
					.addGroup(gl.createParallelGroup()
							.addComponent(lb3)
							.addComponent(sp1))
					);
			
			gl.setHonorsVisibility(true);
			gl.linkSize(SwingConstants.HORIZONTAL, lb1, lb3);

		}
			
		@Override
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus)
		{
			String x1 = (((ListenEintrag)value).getS1());
			String x2 = (((ListenEintrag)value).getS2());
			String x3 = (((ListenEintrag)value).getS3());
			Integer x4 = (((ListenEintrag)value).geti1());
			
			lb1.setText(x1);
			lb2.setText(x2);
			
					
			
			if(x3 == null)
			{
				lb3.setVisible(false);
			}
			else
			{
				lb3.setText(x3);
				lb3.setVisible(true);
			}
			
			if(x4 == null)
			{
				sp1.setVisible(false);
			}
			else
			{
				sp1.setValue(x4);
				sp1.setVisible(true);
			}
			
			if(isSelected)
			{
				setBackground(Color.green);
				
			}
			else
			{
				setBackground(list.getBackground());
			}
			
			return this;
		}
		
	}

}

Wie ihr seht habe ich ein bischen mit dem Ein- und Ausblenden von den Elementen experimentiert.

Auch das Anzeigen der JSpinner funktioniert.
Aber ich kann die Werte nicht ändern.
Es ist so, als würde der JSpinner zwar gezeichnet, aber ohne Funktion.

Gibt es eine (einfache) Möglichkeit die JSpinner in einer JList mit Leben zu erfüllen?
Ist dies mit der JList überhaupt möglich?

(Ich möchte eigendlich keine JTable verwenden, da diese mir (noch) etwas zu kompliziert ist.)

MfG
hansmueller
 
Soweit ich weiß ist das, was du vorhast nicht möglich. Das hat folgenden Grund:
Die Komponenten, die vom CellRenderer zurückgegeben werden werden, wie der Name schon sagt, zum Rendern verwendet. Das bedeudet so viel wie es wird ein Bild generiert. In diesem Fall würde man vermutlich eher von grafischer Benutzeroberfläche oder ähnlichem reden :)
Jedenfalls wirkt es sich auf dein Programm aus. Der Knackpunkt ist der ComponentTree, welcher nicht implementiert wird und daher auch nicht auf Events reagieren wird.
Helfen könnte dir eventuell der CellEditor, welcher von der JTable implementiert wird.
 

Neue Beiträge

Zurück