Hilfe bei JSpinner und JList

Crytek92

Mitglied
Moin

Ich möchte mit dem kleinem "Programm" "JList " und "JSpinner" meiner Schulklasse vorstellen.

Nun hab ich ein Problem und komme nicht weiter.

Ich will, dass wenn man auf den Button drückt oben im TextArea angezeigt wird was man in der Liste ausgewählt hat.
Nun will ich mit dem Spinner aber, einstellen wie oft das im TestArea angezeigt werden soll. Ich weis aber nicht wie ich das hinbekommen soll, hab es zwar geschafft, dass er anzeigt was man ausgewählt hat, aber nicht die anzahl.

Ich hab es erst mit einer Schleife versucht, was aber nicht funktioniert, warum auch immer.

Kann mir da jemand helfen wie ich das machen soll?


Mein Code:

Java:
package JList;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.border.CompoundBorder;
import javax.swing.ListSelectionModel;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JSpinner;
import javax.swing.SpinnerListModel;

public class Vorstellung extends JFrame {

	private JPanel contentPane;
	private JScrollPane scrollPane;
	private JTextArea textArea;
	private JList list;
	private JButton btnNewButton;
	private JSpinner spinner;
	private JButton btnReset;
	public int SpinnerWert;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Vorstellung frame = new Vorstellung();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Vorstellung() {
		initGUI();
	}
	
	
	private void initGUI() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 256, 378);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.NORTH);
		
		textArea = new JTextArea();
		textArea.setRows(10);
		scrollPane.setViewportView(textArea);
		
		list = new JList();
		list.setModel(new AbstractListModel() {
			String[] values = new String[] {"Eintrag 1", "Eintrag 2", "Eintrag 3", "Eintrag 4", "Eintrag 5", "Eintrag 6"};
			public int getSize() {
				return values.length;
			}
			public Object getElementAt(int index) {
				return values[index];
			}
		});
		list.setSelectedIndex(0);
		list.setSize(50, 150);
		contentPane.add(list, BorderLayout.SOUTH);
		
		btnNewButton = new JButton("Ausgabe!");
		btnNewButton.setSize(50, 50);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				
				//for(int i = 0; i >= SpinnerWert; i++){
				
					textArea.append((String) list.getSelectedValue() + "\n");
					//textArea.append((String) spinner.getValue() + "\n");
					
				//}						
			}
		});
		contentPane.add(btnNewButton, BorderLayout.WEST);
		
		spinner = new JSpinner();
		spinner.setModel(new SpinnerListModel(new String[] {"1", "2", "3", "4", "5"}));
		contentPane.add(spinner, BorderLayout.EAST);
		
		
		
		btnReset = new JButton("Reset!");
		btnReset.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				textArea.setText("");
			}
		});
		contentPane.add(btnReset, BorderLayout.CENTER);
	}
	

}
 
Hallo Crytek92,
du hast einige Sachen anweichend von dem Allgemeinen Standard gemacht.
Als erstes dein Layout du hast ein BorderLayout mit Hard gesetzten Size kombiniert. Da ein Border Layout für das was du machen wolltest Definition nicht die richtige Wahl war habe ich dies in ein GridBag Layout ungeändert wenn du dazu Fragen hast stelle sie Ruhig.
Zweitens hast du alle Componenten als Atribute über dem Konstriktor gesetzt obwohl du sie nicht noch einmal aufgerufen werden. Das brauchst du nicht da du keine UI WorkFlow Trennung vornimmst (Du hast deine ActionListener in der selben Klasse wie dein UI)
Drittens man sollte die Componenten auf die du zugreifst (bei dir die JList, das TextArea und den Spinner) vor den ActionComponenten (bei dir die beiden Buttons) erzeugen bei dir ist der Spinner und ein Button vertauscht. Dies führt nach der Entfernung der Atribute zu einem Fehler.

Nun aber zu deinem Problemm 😀
Also du erzeigst einen String spinner also kannst du auch keine Zahl aus deinem Spinner auslesen. das Spinner Model zu einem SpinnerNumberModel ändern und du bist glücklich.
Java:
new SpinnerNumberModel(momentaner Wert, mindest Wert, maximaler Wert, Schrittweite dazwischen)

Dann würde ich keine AbstarctListModel sondern ein DefaultListModel nutzen. Und mit einer Schleife setzten so ersparen wir uns die Hard gesetzten Values.
Java:
DefaultListModel<String> model=new DefaultListModel<String>();
		for(int i=0;i<5;i++){
			model.addElement("Element "+i);
		}

Und ausgeben tun wir dann mit einer Schleife wie du schon selber festgestellt hast.
Java:
	int u=(int) spinner.getValue();
				for(int i = 0; i<u; i++){
					textArea.append(list.getSelectedValue() + "\n");
				}	
				textArea.append("Zahl im Spinner: "+spinner.getValue() + "\n");

Einmal deine ganze klasse Mit freundlichen Grüßen an dich zurück.
Java:
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerNumberModel;
import javax.swing.UIManager;
 

public class Vorstellung extends JFrame {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
					Vorstellung frame = new Vorstellung();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
 
	public Vorstellung() {
		initGUI();
	}
 
 
	private void initGUI() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(256, 378);
		setLocationRelativeTo(null);
		
		GridBagLayout layout=new GridBagLayout();
		layout.columnWeights=new double[]{1.0, 1.0, 1.0, Double.MIN_VALUE};
		layout.rowWeights=new double[]{1.0, 1.0, 0.0, Double.MIN_VALUE};
		setLayout(layout);
		
		JTextArea textArea = new JTextArea();
		JScrollPane scrollPane = new JScrollPane(textArea);
 		add(scrollPane, getConstraints(0, 0, 3,GridBagConstraints.BOTH));
 
		DefaultListModel<String> model=new DefaultListModel<String>();
		for(int i=0;i<5;i++){
			model.addElement("Element "+i);
		}

		JList<String>list = new JList<String>(model);
		add(list, getConstraints(0, 1, 3, GridBagConstraints.BOTH));
 
		JSpinner spinner = new JSpinner();
		spinner.setModel(new SpinnerNumberModel(1, 1, 10, 1));
		add(spinner, getConstraints(1, 2, 1, GridBagConstraints.HORIZONTAL));
 
		JButton btnNewButton = new JButton("Ausgabe!");
		btnNewButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int u=(int) spinner.getValue();
				for(int i = 0; i<u; i++){
					textArea.append(list.getSelectedValue() + "\n");
				}	
				textArea.append("Zahl im Spinner: "+spinner.getValue() + "\n");	
			}
		});
		add(btnNewButton, getConstraints(0, 2, 1, GridBagConstraints.HORIZONTAL));
		
		JButton btnReset = new JButton("Reset");
		btnReset.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				textArea.setText("");
			}
		});
		add(btnReset, getConstraints(2, 2, 1, GridBagConstraints.HORIZONTAL));
	}
	private GridBagConstraints getConstraints(int x,int y,int width,int fill){
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(2, 2, 2, 2);
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.fill=fill;
		gbc.gridwidth=width;
		return gbc;
	}
 
}

p.s. ich hbae dein Programm den SystemStandart Look and Feel übernehmen lassen (es sieht in Windows auch wie Windows aus) das geht mit der Zeile in der static Main:
Java:
try {
	UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
	Vorstellung frame = new Vorstellung();
	frame.setVisible(true);
}catch (Exception e) {
        e.printStackTrace();
}
 
Zuletzt bearbeitet:

Zurück
Oben