Swing JCheckBox in JList einbetten

Burny91

Mitglied
Hallo Allerseits,

ich versuche gerade JCheckboxen in eine JList einzubauen und bin auf folgendes Problem gestoßen. Wenn ich JCheckBoxen meiner JList hinzufüge erscheint in der JList nur ein Eintrag mit X Parametern von einem JCheckBox Objekt. Wie bekomme ich es auf die Reihe. JCheckBoxen mit Namen angezeigt zu bekommen?

Mein aktueller Stand:

Java:
public class ColumnFilter extends javax.swing.JDialog {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JLabel text;
	private JList spaltList;
	private JScrollPane listScroll;
	private JSeparator jSeparator1;
	private JButton cancelBut;
	private JButton okBut;
	private final Component[] stats_option = { new JCheckBox("1"),
			new JCheckBox("2"), new JCheckBox("3"), new JCheckBox("4"),
			new JCheckBox("5") };

	/**
	 * Auto-generated main method to display this JDialog
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame();
				ColumnFilter inst = new ColumnFilter(frame);
				inst.setVisible(true);
			}
		});
	}

	public ColumnFilter(JFrame frame) {
		super(frame);
		initGUI();
	}

	private void initGUI() {
		try {
			{
				GridBagLayout thisLayout = new GridBagLayout();
				thisLayout.columnWidths = new int[] { 31, 7 };
				thisLayout.columnWeights = new double[] { 0.0, 0.0 };
				thisLayout.rowWeights = new double[] { 0.0, 0.1, 0.0, 0.0, 0.0,
						0.1, 0.0 };
				thisLayout.rowHeights = new int[] { 7, 20, 7, 105, 7, 20, 7 };
				getContentPane().setLayout(thisLayout);
				this.setTitle("ColumnFilter");
				{
					okBut = new JButton();
					getContentPane().add(
							okBut,
							new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0,
									GridBagConstraints.EAST,
									GridBagConstraints.NONE, new Insets(0, 0,
											0, 80), 0, 0));
					okBut.setText("OK");
				}
				{
					cancelBut = new JButton();
					getContentPane().add(
							cancelBut,
							new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0,
									GridBagConstraints.EAST,
									GridBagConstraints.NONE, new Insets(0, 0,
											0, 0), 0, 0));
					cancelBut.setText("Cancel");
				}
				{
					jSeparator1 = new JSeparator();
					getContentPane().add(
							jSeparator1,
							new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0,
									GridBagConstraints.CENTER,
									GridBagConstraints.NONE, new Insets(0, 0,
											0, 0), 0, 0));
				}
				{
					text = new JLabel();
					getContentPane().add(
							text,
							new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
									GridBagConstraints.CENTER,
									GridBagConstraints.HORIZONTAL, new Insets(
											0, 0, 0, 0), 0, 0));
					text.setText("Wähle die Spalten aus, die angezeigt werden sollen");
				}
				{
					listScroll = new JScrollPane();
					getContentPane().add(
							listScroll,
							new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0,
									GridBagConstraints.CENTER,
									GridBagConstraints.BOTH, new Insets(0, 0,
											0, 0), 0, 0));
					{
						// JCheckBox one = new JCheckBox("One");
						// JCheckBox two = new JCheckBox("Two");
						// ListModel spaltListModel = new
						// DefaultComboBoxModel(
						// new JCheckBox[] { one, two });
						spaltList = new JList(stats_option);
						listScroll.setViewportView(spaltList);
						// spaltList.setModel(spaltListModel);
					}
				}

			}
			this.setSize(327, 252);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Mit freundlichen Grüßen

burny
 
Grundsätzlich stellt sich die Frage, wenn es sich - wie in dem Beispielcode - um eine feste und begrenzte Anzahl von JCheckBoxes handelt, müssen die in eine JList? Sollen diese tatsächlich ausgewählt werden können? Eine CheckBox wird ja i.d.R. nur de/aktiviert.
Wenn es also nur um die Anorderung der CheckBoxes geht, sollte man das über ein JPanel lösen.

Müssen die Boxen tatsächlich in eine JList, dann müss ein entsprechender Renderer verwendet werden.
Aller "höheren" Komponenten in Swing verwenden zum Darstellen Ihrer Inhalte Renderer. Die JList verwendet einen ListCellRenderer z.B. DefaultListCellRenderer. Mit dem Renderer kann man festlegen, wie der Zelleninhalt dargestellt werden soll, die im Renderer verwendete Komponente wird entsprechend dem Zelleninhalt modifierziert und dann an die passende Stelle in der JList gemalt.
Wenn man nach ListCellRenderer oder DefaultListCellRenderer hier oder im Internet sucht findet man genügend Beispiele zur Verwendung eines Renderers
 
Um die Fragen zu beatworten, nein es handelt sich um eine variable Anzahl von CheckBoxen. Die Checkboxen repräsentieren die Spaltennamen einer Tablle. Durch das An- und Abwählen der Checkboxen wird eine JTable nur noch mit den angewählen CheckBoxen angezeigt. Das Ziel ist ein Filter für eine Tabelle.

Und zur anderen Frage ob die Boxen tatsächlich in eine JList müssen kann ich noch nicht beantworten. Weil ich noch keine plausiblen Alternativen habe.
 
Hallo,

wenn es nur eine einfache Liste von JCheckboxen sein soll, solltest du es so machen, wie Michael es beschrieben hat:
Michael... hat gesagt.:
Wenn es also nur um die Anorderung der CheckBoxes geht, sollte man das über ein JPanel lösen.
Für das JPanel könntest du einen BoxLayout-Manager verwenden um die JCheckboxen schön untereinander anzuordnen. Oder ein GridLayout, wenn die Anzahl der JCheckboxen bekannt sind.
Diese JPanel packst du dann in ein JScrollPane.
Dem JScrollPane kann man auch mit .setColumnHeaderView() eine Kopfzeile mitgeben.
Und fertig hast du deine "Liste".

Wenn du aber auf eine JList mit JCheckboxen bestehst, solltest du mal Google bemühen. Da gibt es schon viele Beispiele. Diese sind aber teilweise nicht so einfach. So was solltest du nur machen, wenn du etwas eher ausgefallenes haben möchtest, z. B. Einträge, die unterschiedlich aufgebaut (z. B. mehrzeilig) sind. Aber das ist dann mit einer ganzen Portion Arbeit und Gehirnschmalz verbunden.

MfG
hansmueller
 
in einem JPanel wäre es -wie Michael... es sagt- die einfachste Alternative.

Java:
panel = new JPanel();
					panel.setLayout(new GridLayout(stats_option.length, 2));
					for (int i = 0; i < stats_option.length; i++) {
						panel.add(new JLabel("beschreibung\t\t"));
						panel.add(stats_option[i]);
					}
					listScroll = new JScrollPane(panel);
					getContentPane().add(
							listScroll,
							new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0,
									GridBagConstraints.CENTER,
									GridBagConstraints.BOTH, new Insets(0, 0,
											0, 0), 0, 0));
 

Neue Themen


Zurück
Oben