Swing Reihenfolge der Initialisierung von Komponenten

Curry

Aktives Mitglied
Hallo Leute!

Ich habe eine Frage zur Programmstruktur.

Ich möchte gerne mit Action-Klassen (abgeleitet von "AbstractAction") arbeiten, da mehrere Komponenten (z.B. Menü, Button, Taste auf dem Keyboard) dieselbe Funktion aufrufen sollen. Doch gleich bei einer der ersten gibt's ein Problem, für das ich keine Lösung weiß.

Die Klasse "ToggleFilterPanelAction" wird im Konstruktor "MainFrame()" vor dem Aufruf der Methode "initComponents()" initialisiert. Dummerweise benötigt "ToggleFilterPanelAction" die Instanz? des "JXCollapsiblePane" (in meinem Beispiel die Variable "cp1"). Diese gibt es zu dem Zeitpunkt der Initialisierung der besagten Action-Klasse noch nicht und somit wird die Funktion auch nicht richtig ausgeführt.

Initialisierung ich die Action-Klasse erst nach "initComponents()", dann fehlt den Komponenten (derzeit nur das entsprechende Menü-Item) die Instanz? der Action-Klasse. Somit funktioniert auch dies nicht.

Wie kann ich das Problem lösen?

Würde mich sehr über eure Hilfe freuen!

Java:
package view;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableRowSorter;
import model.LibraryTableModel;
import model.Paper;
import model.Subjects;
import org.jdesktop.swingx.JXCollapsiblePane;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXStatusBar;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.jdesktop.swingx.decorator.HighlighterFactory;

/**
 * Diese Klasse dient zur Darstellung des Hauptfensters des Programms.
 */
public class MainFrame extends JXFrame {

	private LibraryTableModel libraryTableModel;
	private JXTable libraryTable;
	private TableRowSorter<LibraryTableModel> sorter;
	private JPanel controlPanel;
	private JTextField filterText;
	private JComboBox strictComboBox;
	private JList filterSubject;
	private DefaultListModel filterSubjectModel;
	private JComponent statusBarLeft;
	private JLabel actionStatus;
	private JLabel tableRows;
	private JLabel modelRows;
	JXCollapsiblePane cp1;

	ToggleFilterPanelAction actionToggleFilter;
	CloseAction actionClose;

	/**
	 * Konstruktur.
	 */
	public MainFrame() {
		super("GreatLibrary");
		setDefaultCloseOperation(JXFrame.EXIT_ON_CLOSE);

		actionToggleFilter = new ToggleFilterPanelAction();
		actionClose = new CloseAction();

		initComponents();
		pack();
		setLocationRelativeTo(null);
		
	}

	/**
	 * Initialisierung und Zusammenbau der Komponenten des Hauptfensters.
	 */
	private void initComponents() {

		// Menu
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(createFileMenu());
		setJMenuBar(menuBar);

		setLayout(new BorderLayout());

		cp1 = new JXCollapsiblePane();
		cp1.setLayout(new BorderLayout());

		controlPanel = createControlPanel();
		cp1.add(controlPanel, BorderLayout.NORTH);

		add(cp1, BorderLayout.NORTH);

		libraryTableModel = new LibraryTableModel();
		libraryTable = new JXTable(libraryTableModel);
		libraryTable.setColumnControlVisible(true);
		libraryTable.setShowGrid(false, false);
		libraryTable.addHighlighter(HighlighterFactory.createSimpleStriping());
		libraryTable.setVisibleRowCount(25);
		libraryTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		libraryTable.getColumnModel().getColumn(0).setPreferredWidth(1100);
		libraryTable.getColumnModel().getColumn(1).setPreferredWidth(400);
		libraryTable.getColumnModel().getColumn(2).setPreferredWidth(75);
		libraryTable.getColumnModel().getColumn(3).setPreferredWidth(200);

		sorter = new TableRowSorter<LibraryTableModel>(libraryTableModel);
		libraryTable.setRowSorter(sorter);

		JScrollPane scrollpane = new JScrollPane(libraryTable);

		libraryTableModel.addTableModelListener(new TableModelListener() {

			public void tableChanged(TableModelEvent e) {
				System.out.println("TableModelListener -> tableChanged()");
				updateStatusBar();
			}
		});

		add(scrollpane, BorderLayout.CENTER);

		add(createStatusBar(), BorderLayout.SOUTH);
		updateStatusBar();
	}

	protected JPanel createControlPanel() {
		ArrayList<String> list;
		JPanel panel = new JPanel();

		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();
		panel.setLayout(gridbag);

		c.gridx = 0;
		c.gridy = 1;
		c.gridheight = 1;
		c.insets = new Insets(20, 10, 0, 10);
		c.anchor = GridBagConstraints.SOUTHWEST;
		JLabel l1 = new JLabel("Title:");
		panel.add(l1, c);

		c.gridx = 0;
		c.gridy = 2;
		c.weightx = 1.0;
		c.insets.top = 0;
		c.insets.bottom = 12;
		c.anchor = GridBagConstraints.SOUTHWEST;
		filterText = new JTextField(24);
		panel.add(filterText, c);

		filterText.getDocument().addDocumentListener(
				new DocumentListener() {

					public void changedUpdate(DocumentEvent e) {
						newFilter();
					}

					public void insertUpdate(DocumentEvent e) {
						newFilter();
					}

					public void removeUpdate(DocumentEvent e) {
						newFilter();
					}
				});

		// ##################################################################

		c.gridx = 1;
		c.gridy = 1;
		c.gridheight = 1;
		c.insets = new Insets(20, 10, 0, 10);
		c.anchor = GridBagConstraints.SOUTHWEST;
		JLabel l2 = new JLabel("Subject:");
//        searchLabel.setName("searchLabel");
		panel.add(l2, c);

		c.gridx = 1;
		c.gridy = 2;
		c.weightx = 1.0;
		c.insets.top = 0;
		c.insets.bottom = 12;
		c.anchor = GridBagConstraints.SOUTHWEST;
		strictComboBox = new JComboBox();
		Subjects subjects = Subjects.getInstance();
		list = subjects.getSubjects();
		strictComboBox.setModel(new ListComboBoxModel<String>(list));
//		AutoCompleteDecorator.decorate(strictComboBox);
		strictComboBox.addKeyListener(
				new KeyAdapter() {

					@Override
					public void keyPressed(KeyEvent event) {
						if (event.getKeyCode() == KeyEvent.VK_ENTER) {

							String str = (String) strictComboBox.getSelectedItem();

							if (filterSubjectModel.contains(strictComboBox.getSelectedItem()) == false) {
								System.out.println("add to subject filter: " + str);
								filterSubjectModel.addElement(str);
							} else {
								System.out.println("do not add to subject filter = " + str);
							}
						}
					}
				});
		panel.add(strictComboBox, c);

		filterSubjectModel = new DefaultListModel();
		filterSubjectModel.addListDataListener(
				new ListDataListener() {

					public void contentsChanged(ListDataEvent e) {
					}

					public void intervalAdded(ListDataEvent e) {
						newFilter();
					}

					public void intervalRemoved(ListDataEvent e) {
						newFilter();
					}
				});
		filterSubject = new JList(filterSubjectModel);
		filterSubject.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		filterSubject.addKeyListener(
				new KeyAdapter() {

					@Override
					public void keyPressed(KeyEvent event) {
						if (event.getKeyCode() == KeyEvent.VK_ENTER) {
							if (filterSubject.isSelectionEmpty() == false) {
								String str = (String) filterSubject.getSelectedValue();
								System.out.println("remove from subject filter: " + str);
								filterSubjectModel.removeElement(str);
							} else {
								System.out.println("remove from subject filter: no entry");
							}
						}
					}
				});
		JScrollPane sp = new JScrollPane(filterSubject);
		c.gridx = 3;
		c.gridy = 1;
		c.gridheight = 2;
		c.insets = new Insets(20, 10, 0, 10);
		c.anchor = GridBagConstraints.SOUTHWEST;
		panel.add(sp, c);

		return panel;
	}

	/**
	 * TODO: Müssen alle Filter in einer Funktion sein, oder kann ich auch mehrere Funktionen schreiben?
	 */
	private void newFilter() {

		RowFilter<LibraryTableModel, Integer> filter1 = new RowFilter<LibraryTableModel, Integer>() {

			@Override
			public boolean include(Entry<? extends LibraryTableModel, ? extends Integer> entry) {
				LibraryTableModel tableModel = entry.getModel();
				Paper paper = tableModel.getPaper(entry.getIdentifier());
				String title = paper.getTitle().toLowerCase();
				String text = paper.getText().toLowerCase();
				String comment = paper.getComment().toLowerCase();
				String id = String.valueOf(paper.getId());
				final String filter = filterText.getText().toLowerCase();

				if (title.contains(filter) || text.contains(filter) || comment.contains(filter) || id.startsWith(filter)) {
					return true;
				}
				return false;
			}
		};

		RowFilter<LibraryTableModel, Integer> filter2 = new RowFilter<LibraryTableModel, Integer>() {

			@Override
			public boolean include(Entry<? extends LibraryTableModel, ? extends Integer> entry) {
				LibraryTableModel tableModel = entry.getModel();
				Paper paper = tableModel.getPaper(entry.getIdentifier());

				ArrayList<String> arrayList = new ArrayList<String>();
				for (int i = 0; i < filterSubjectModel.size(); i++) {
					System.out.println("i=" + i + "\t" + filterSubjectModel.size() + "\t" + filterSubjectModel.get(i)); // TODO: Wieso kommt diese Aussage mehrmals?
					arrayList.add((String) filterSubjectModel.get(i));
				}

				if (paper.getSubjects().containsAll(arrayList)) {
					return true;
				}

				return false;
			}
		};

		final ArrayList<RowFilter<LibraryTableModel, Integer>> filters = new ArrayList<RowFilter<LibraryTableModel, Integer>>(2);
		filters.add(filter1);
		filters.add(filter2);
		final RowFilter<LibraryTableModel, Integer> filter = RowFilter.andFilter(filters);
		sorter.setRowFilter(filter);
		updateStatusBar();
	}

	/**
	 * TODO: Den Inhalt dieser Funktion verstehe ich nicht komplett.
	 * @return
	 */
	protected Container createStatusBar() {

		JXStatusBar statusBar = new JXStatusBar();
		statusBar.putClientProperty("auto-add-separator", Boolean.FALSE);
		// Left status area
		statusBar.add(Box.createRigidArea(new Dimension(10, 22)));
		statusBarLeft = Box.createHorizontalBox();
		statusBar.add(statusBarLeft, JXStatusBar.Constraint.ResizeBehavior.FILL);
		actionStatus = new JLabel();
		actionStatus.setName("loadingStatusLabel");
		actionStatus.setHorizontalAlignment(JLabel.LEADING);
		statusBarLeft.add(actionStatus);

		statusBar.add(Box.createVerticalGlue());
		statusBar.add(Box.createRigidArea(new Dimension(50, 0)));

		// Right status area
		JComponent bar = Box.createHorizontalBox();
		bar.add(new JLabel("Showing "));

		tableRows = new JLabel("0");
		bar.add(tableRows);

		bar.add(new JLabel(" of "));

		modelRows = new JLabel("0");
		bar.add(modelRows);

		bar.add(new JLabel(" Papers"));

		statusBar.add(bar);
		statusBar.add(Box.createHorizontalStrut(12));
		return statusBar;
	}

	/**
	 * Updates status labels. Called during loading and on changes to the filter controller state.
	 */
	protected void updateStatusBar() {
		System.out.println("updateStatusBar()");
		tableRows.setText("" + libraryTable.getRowCount());
		modelRows.setText("" + libraryTableModel.getRowCount());
	}

	// ###############################################################################################
	// MENU
	// ###############################################################################################

	private JMenu createFileMenu() {
		JMenu ret = new JMenu("Datei");
		JMenuItem mi;

		mi = new JMenuItem(actionToggleFilter);
		ret.add(mi);

		ret.addSeparator();

		mi = new JMenuItem(actionClose);
		ret.add(mi);

		return ret;
    }

	// ###############################################################################################
	// ACTION
	// ###############################################################################################
	class ToggleFilterPanelAction extends AbstractAction {

		Boolean status = true;
		{
			putValue(Action.NAME, "Filter ausblenden");
			putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			if(status == true) {
				System.out.println("Filter aus");
				putValue(Action.NAME, "Filter einblenden");
				status = false;
			} else {
				System.out.println("Filter ein");
				putValue(Action.NAME, "Filter ausblenden");
				status = true;
			}
			cp1.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION);
			
		}
	}

	class CloseAction extends AbstractAction {

		{
			putValue(Action.NAME, "Beenden");
			putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, 0);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
		}
	}
}
 

Landei

Top Contributor
Ganz sicher, dass das nicht funktioniert? ToggleFilterPanelAction benötigt doch cp1 erst, wenn jemand diese Aktion ausführt - was erst nach dem Konstruktor und damit nach initComponents passieren sollte. Bekommst du denn eine NullPointerException in Zeile 405? Wenn nicht, liegt es an etwas anderem.
 

Curry

Aktives Mitglied
Danke für Deine Antwort! Du hast recht, daran liegt es nicht. Ich habe jetzt in Zeile 101 bis 112 zwei Menu-Items zum Ein- und Ausblenden des Panels erstellt. Das eine verwendet meine Aktion-Klasse "ToggleFilterPanelAction" und die andere hat die Funktion direkt bekommen (cp1.getActionMap().get("toggle")).

Erstere kennt die Komponente auch, das zeigt diese Ausgabe bei betätigung:
Code:
component -> org.jdesktop.swingx.JXCollapsiblePane[,0,0,1793x151,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=265,maximumSize=,minimumSize=,preferredSize=]

Stellt sich nur die Frage, warum wird die toggle-Funktion nicht ausgeführt, wenn sie über die Aktion-Klasse aufgerufen wird?

Java:
package view;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableRowSorter;
import model.LibraryTableModel;
import model.Paper;
import model.Subjects;
import org.jdesktop.swingx.JXCollapsiblePane;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXStatusBar;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.jdesktop.swingx.decorator.HighlighterFactory;

/**
 * Diese Klasse dient zur Darstellung des Hauptfensters des Programms.
 */
public class MainFrame extends JXFrame {

	private LibraryTableModel libraryTableModel;
	private JXTable libraryTable;
	private TableRowSorter<LibraryTableModel> sorter;
	private JPanel controlPanel;
	private JTextField filterText;
	private JComboBox strictComboBox;
	private JList filterSubject;
	private DefaultListModel filterSubjectModel;
	private JComponent statusBarLeft;
	private JLabel actionStatus;
	private JLabel tableRows;
	private JLabel modelRows;
	JXCollapsiblePane cp1;
	ToggleFilterPanelAction actionToggleFilter;
	CloseAction actionClose;

	/**
	 * Konstruktur.
	 */
	public MainFrame() {
		super("GreatLibrary");
		setDefaultCloseOperation(JXFrame.EXIT_ON_CLOSE);


		actionClose = new CloseAction();

		initComponents();

		pack();
		setLocationRelativeTo(null);

	}

	/**
	 * Initialisierung und Zusammenbau der Komponenten des Hauptfensters.
	 */
	private void initComponents() {

		setLayout(new BorderLayout());

		cp1 = new JXCollapsiblePane();
		cp1.setLayout(new BorderLayout());

		controlPanel = createControlPanel();
		cp1.add(controlPanel, BorderLayout.NORTH);

		add(cp1, BorderLayout.NORTH);

		// Menu
		actionToggleFilter = new ToggleFilterPanelAction();
		JMenuBar menuBar = new JMenuBar();
		JMenu ret = new JMenu("Datei");
		JMenuItem mi = new JMenuItem(actionToggleFilter); // menuBar.add(createFileMenu());
		ret.add(mi);
		menuBar.add(ret);
		setJMenuBar(menuBar);

		JMenu ret2 = new JMenu("Datei2");
		JMenuItem mi2 = new JMenuItem(cp1.getActionMap().get("toggle"));
		ret2.add(mi2);
		menuBar.add(ret2);

		libraryTableModel = new LibraryTableModel();
		libraryTable = new JXTable(libraryTableModel);
		libraryTable.setColumnControlVisible(true);
		libraryTable.setShowGrid(false, false);
		libraryTable.addHighlighter(HighlighterFactory.createSimpleStriping());
		libraryTable.setVisibleRowCount(25);
		libraryTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		libraryTable.getColumnModel().getColumn(0).setPreferredWidth(1100);
		libraryTable.getColumnModel().getColumn(1).setPreferredWidth(400);
		libraryTable.getColumnModel().getColumn(2).setPreferredWidth(75);
		libraryTable.getColumnModel().getColumn(3).setPreferredWidth(200);

		sorter = new TableRowSorter<LibraryTableModel>(libraryTableModel);
		libraryTable.setRowSorter(sorter);

		JScrollPane scrollpane = new JScrollPane(libraryTable);

		libraryTableModel.addTableModelListener(new TableModelListener() {

			public void tableChanged(TableModelEvent e) {
				System.out.println("TableModelListener -> tableChanged()");
				updateStatusBar();
			}
		});

		add(scrollpane, BorderLayout.CENTER);

		add(createStatusBar(), BorderLayout.SOUTH);
		updateStatusBar();
	}

	protected JPanel createControlPanel() {
		ArrayList<String> list;
		JPanel panel = new JPanel();

		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();
		panel.setLayout(gridbag);

		c.gridx = 0;
		c.gridy = 1;
		c.gridheight = 1;
		c.insets = new Insets(20, 10, 0, 10);
		c.anchor = GridBagConstraints.SOUTHWEST;
		JLabel l1 = new JLabel("Title:");
		panel.add(l1, c);

		c.gridx = 0;
		c.gridy = 2;
		c.weightx = 1.0;
		c.insets.top = 0;
		c.insets.bottom = 12;
		c.anchor = GridBagConstraints.SOUTHWEST;
		filterText = new JTextField(24);
		panel.add(filterText, c);

		filterText.getDocument().addDocumentListener(
				new DocumentListener() {

					public void changedUpdate(DocumentEvent e) {
						newFilter();
					}

					public void insertUpdate(DocumentEvent e) {
						newFilter();
					}

					public void removeUpdate(DocumentEvent e) {
						newFilter();
					}
				});

		// ##################################################################

		c.gridx = 1;
		c.gridy = 1;
		c.gridheight = 1;
		c.insets = new Insets(20, 10, 0, 10);
		c.anchor = GridBagConstraints.SOUTHWEST;
		JLabel l2 = new JLabel("Subject:");
//        searchLabel.setName("searchLabel");
		panel.add(l2, c);

		c.gridx = 1;
		c.gridy = 2;
		c.weightx = 1.0;
		c.insets.top = 0;
		c.insets.bottom = 12;
		c.anchor = GridBagConstraints.SOUTHWEST;
		strictComboBox = new JComboBox();
		Subjects subjects = Subjects.getInstance();
		list = subjects.getSubjects();
		strictComboBox.setModel(new ListComboBoxModel<String>(list));
//		AutoCompleteDecorator.decorate(strictComboBox);
		strictComboBox.addKeyListener(
				new KeyAdapter() {

					@Override
					public void keyPressed(KeyEvent event) {
						if (event.getKeyCode() == KeyEvent.VK_ENTER) {

							String str = (String) strictComboBox.getSelectedItem();

							if (filterSubjectModel.contains(strictComboBox.getSelectedItem()) == false) {
								System.out.println("add to subject filter: " + str);
								filterSubjectModel.addElement(str);
							} else {
								System.out.println("do not add to subject filter = " + str);
							}
						}
					}
				});
		panel.add(strictComboBox, c);

		filterSubjectModel = new DefaultListModel();
		filterSubjectModel.addListDataListener(
				new ListDataListener() {

					public void contentsChanged(ListDataEvent e) {
					}

					public void intervalAdded(ListDataEvent e) {
						newFilter();
					}

					public void intervalRemoved(ListDataEvent e) {
						newFilter();
					}
				});
		filterSubject = new JList(filterSubjectModel);
		filterSubject.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		filterSubject.addKeyListener(
				new KeyAdapter() {

					@Override
					public void keyPressed(KeyEvent event) {
						if (event.getKeyCode() == KeyEvent.VK_ENTER) {
							if (filterSubject.isSelectionEmpty() == false) {
								String str = (String) filterSubject.getSelectedValue();
								System.out.println("remove from subject filter: " + str);
								filterSubjectModel.removeElement(str);
							} else {
								System.out.println("remove from subject filter: no entry");
							}
						}
					}
				});
		JScrollPane sp = new JScrollPane(filterSubject);
		c.gridx = 3;
		c.gridy = 1;
		c.gridheight = 2;
		c.insets = new Insets(20, 10, 0, 10);
		c.anchor = GridBagConstraints.SOUTHWEST;
		panel.add(sp, c);

		return panel;
	}

	/**
	 * TODO: Müssen alle Filter in einer Funktion sein, oder kann ich auch mehrere Funktionen schreiben?
	 */
	private void newFilter() {

		RowFilter<LibraryTableModel, Integer> filter1 = new RowFilter<LibraryTableModel, Integer>() {

			@Override
			public boolean include(Entry<? extends LibraryTableModel, ? extends Integer> entry) {
				LibraryTableModel tableModel = entry.getModel();
				Paper paper = tableModel.getPaper(entry.getIdentifier());
				String title = paper.getTitle().toLowerCase();
				String text = paper.getText().toLowerCase();
				String comment = paper.getComment().toLowerCase();
				String id = String.valueOf(paper.getId());
				final String filter = filterText.getText().toLowerCase();

				if (title.contains(filter) || text.contains(filter) || comment.contains(filter) || id.startsWith(filter)) {
					return true;
				}
				return false;
			}
		};

		RowFilter<LibraryTableModel, Integer> filter2 = new RowFilter<LibraryTableModel, Integer>() {

			@Override
			public boolean include(Entry<? extends LibraryTableModel, ? extends Integer> entry) {
				LibraryTableModel tableModel = entry.getModel();
				Paper paper = tableModel.getPaper(entry.getIdentifier());

				ArrayList<String> arrayList = new ArrayList<String>();
				for (int i = 0; i < filterSubjectModel.size(); i++) {
					System.out.println("i=" + i + "\t" + filterSubjectModel.size() + "\t" + filterSubjectModel.get(i)); // TODO: Wieso kommt diese Aussage mehrmals?
					arrayList.add((String) filterSubjectModel.get(i));
				}

				if (paper.getSubjects().containsAll(arrayList)) {
					return true;
				}

				return false;
			}
		};

		final ArrayList<RowFilter<LibraryTableModel, Integer>> filters = new ArrayList<RowFilter<LibraryTableModel, Integer>>(2);
		filters.add(filter1);
		filters.add(filter2);
		final RowFilter<LibraryTableModel, Integer> filter = RowFilter.andFilter(filters);
		sorter.setRowFilter(filter);
		updateStatusBar();
	}

	/**
	 * TODO: Den Inhalt dieser Funktion verstehe ich nicht komplett.
	 * @return
	 */
	protected Container createStatusBar() {

		JXStatusBar statusBar = new JXStatusBar();
		statusBar.putClientProperty("auto-add-separator", Boolean.FALSE);
		// Left status area
		statusBar.add(Box.createRigidArea(new Dimension(10, 22)));
		statusBarLeft = Box.createHorizontalBox();
		statusBar.add(statusBarLeft, JXStatusBar.Constraint.ResizeBehavior.FILL);
		actionStatus = new JLabel();
		actionStatus.setName("loadingStatusLabel");
		actionStatus.setHorizontalAlignment(JLabel.LEADING);
		statusBarLeft.add(actionStatus);

		statusBar.add(Box.createVerticalGlue());
		statusBar.add(Box.createRigidArea(new Dimension(50, 0)));

		// Right status area
		JComponent bar = Box.createHorizontalBox();
		bar.add(new JLabel("Showing "));

		tableRows = new JLabel("0");
		bar.add(tableRows);

		bar.add(new JLabel(" of "));

		modelRows = new JLabel("0");
		bar.add(modelRows);

		bar.add(new JLabel(" Papers"));

		statusBar.add(bar);
		statusBar.add(Box.createHorizontalStrut(12));
		return statusBar;
	}

	/**
	 * Updates status labels. Called during loading and on changes to the filter controller state.
	 */
	protected void updateStatusBar() {
		System.out.println("updateStatusBar()");
		tableRows.setText("" + libraryTable.getRowCount());
		modelRows.setText("" + libraryTableModel.getRowCount());
	}

	// ###############################################################################################
	// MENU
	// ###############################################################################################
	private JMenu createFileMenu() {
		JMenu ret = new JMenu("Datei");
		JMenuItem mi;

		mi = new JMenuItem(actionToggleFilter);
		ret.add(mi);

		ret.addSeparator();

		mi = new JMenuItem(actionClose);
		ret.add(mi);

		return ret;
	}

	// ###############################################################################################
	// ACTION
	// ###############################################################################################
	class ToggleFilterPanelAction extends AbstractAction {

		Boolean status = true;

		{
			putValue(Action.NAME, "Filter ausblenden");
//			putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			if (status == true) {
				putValue(Action.NAME, "Filter einblenden");
				status = false;
			} else {
				putValue(Action.NAME, "Filter ausblenden");
				status = true;
			}
			cp1.getActionMap().get("toggle");
			System.out.println("component -> " + cp1.toString());

		}
	}

	class CloseAction extends AbstractAction {

		{
			putValue(Action.NAME, "Beenden");
			putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, 0);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
		}
	}
}
 

Landei

Top Contributor
Das sollte dir ein Debugger beantworten können.

Aber noch eine vage Erinnerung aus meinem montagmorgendlichen Hirn: Ich meine mich dumpf zu erinnern, dass "früher" (nicht sicher ob Java 1.5 oder 1.6) nicht alle Zustandsänderungen von einer Komponente auf die andere übertragen wurde, obwohl beide eine gemeinsame Action hatten. Benutzt du Java 1.7? Falls nicht, solltest du es mal damit probieren.
 

Curry

Aktives Mitglied
Ich habe das Problem gelöst, aber nicht verstanden.

Mit dieser Version der Aktion-Klasse funktioniert es:
Java:
class ToggleFilterPanelAction extends AbstractAction {

	Boolean isCollapsed = false;

	{
		putValue(Action.NAME, "Filter ausblenden");
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (isCollapsed == false) {
			putValue(Action.NAME, "Filter einblenden");
			cp1.setCollapsed(true);
			isCollapsed = true;
		} else {
			putValue(Action.NAME, "Filter ausblenden");
			cp1.setCollapsed(false);
			isCollapsed = false;
		}
	}
}

Mit dieser Version jedoch nicht:
Java:
class ToggleFilterPanelAction extends AbstractAction {

	Boolean status = true;
	{
		putValue(Action.NAME, "Filter ausblenden");
		putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(status == true) {
			System.out.println("Filter aus");
			putValue(Action.NAME, "Filter einblenden");
			status = false;
		} else {
			System.out.println("Filter ein");
			putValue(Action.NAME, "Filter ausblenden");
			status = true;
		}
		cp1.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION);

	}
}

Allerdings funktioniert aber der Funktionsaufruf
Java:
cp1.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION);
wenn man ihn dem MenuItem direkt zuweist.

Also
Java:
JMenuItem mi2 = new JMenuItem(cp1.getActionMap().get("toggle"));
anstatt
Java:
JMenuItem mi = new JMenuItem(actionToggleFilter);
.

Warum? Mit dem Debugger habe ich bisher noch nichts gemacht. Wie kann ich es damit herausfinden?
 
S

SlaterB

Gast
> cp1.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION);
liefert eine Action, ein Objekt, einen Rückgabewert, den du nicht nutzt,

insofern hat diese Codezeile insgesamt betrachtet in der Tat keine Auswirkung,
ganz gewiss wird die Action nicht ausgeführt,
dafür könntest du vielleicht die Methode actionPerformed() selber aufrufen, falls das dein Ziel ist..,

wenn du den Rückgabewert, die Action, im MenuItem als Action setzt,
dann wird sie offensichtlich ausgeführt wenn man dort herumklickt

zum Vergleich:
wenn du ein Objekt deiner Action-Klasse erstellst, passiert ja auch nix,
erst wenn du dieses Action-Objekt ans MenuItem zuweist passiert dann später was,
oder wie gesagt alternativ selber actionPerformed() aufrufen, auch wenn das eher unsauber ist
 
Zuletzt bearbeitet von einem Moderator:

Curry

Aktives Mitglied
Stimmt, mit
Java:
cp1.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION).actionPerformed(e);
funktioniert es. Jetzt verstehe ich es auch. Meine Action muss das Event an die Action "TOGGLE_ACTION" weiter reichen.

Vielen Dank für eure Hilfe!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JavaFX Timeline KeyFrame Reihenfolge AWT, Swing, JavaFX & SWT 6
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
K Swing Reihenfolge bei ActionListenern AWT, Swing, JavaFX & SWT 1
J Reihenfolge der Punkte in Vielecken AWT, Swing, JavaFX & SWT 3
GUI-Programmer JFilechooser, mehrere Datein selektieren und Reihenfolge (2) AWT, Swing, JavaFX & SWT 8
T Java-Anwendung arbeitet Programm in seltsamer Reihenfolge ab AWT, Swing, JavaFX & SWT 3
M Komponenten in anderer Reihenfolge anzeigen AWT, Swing, JavaFX & SWT 4
lumo LayoutManager SWT GridLayout - Reihenfolge ändern AWT, Swing, JavaFX & SWT 7
P Swing Hierachie oder Reihenfolge von Komponenten AWT, Swing, JavaFX & SWT 5
C Swing Text eines JButton mit String definieren? Reihenfolge? AWT, Swing, JavaFX & SWT 6
D Swing JOptionPane + FileChooser .. Reihenfolge wichtig!? AWT, Swing, JavaFX & SWT 7
A Reihenfolge von ActionListener und InputVerifier AWT, Swing, JavaFX & SWT 4
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
T Tab Reihenfolge bei JTextFeldern ändern AWT, Swing, JavaFX & SWT 4
H Reihenfolge z.B. KeyPressed in Child/Parent AWT, Swing, JavaFX & SWT 11
G Reihenfolge von Events AWT, Swing, JavaFX & SWT 4
S Labels und Button übereinander --> Reihenfolge? AWT, Swing, JavaFX & SWT 4
M Tab-Reihenfolge aber mit SWT AWT, Swing, JavaFX & SWT 1
K Tab-Reihenfolge AWT, Swing, JavaFX & SWT 7
T "globaler" keylistener/tab-reihenfolge/insertcurso AWT, Swing, JavaFX & SWT 5
B JTree - Reihenfolge der Nodes verändern AWT, Swing, JavaFX & SWT 3
N Fokus Reihenfolge ändern AWT, Swing, JavaFX & SWT 12
bernd Reihenfolge beim springen mit Tab-Taste ändern! AWT, Swing, JavaFX & SWT 4
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
K Initialisierung von Oberfläche Richtig? AWT, Swing, JavaFX & SWT 5
X Swing Initialisierung des JTree AWT, Swing, JavaFX & SWT 12
M Probleme bei Initialisierung von JTabbedPane AWT, Swing, JavaFX & SWT 4
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
morphesus Swing Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 8
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Komponenten organisieren AWT, Swing, JavaFX & SWT 9
S Überlappung zweier Komponenten AWT, Swing, JavaFX & SWT 12
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Komponenten verstecken AWT, Swing, JavaFX & SWT 4
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
S Problem mit Swing Komponenten AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben