Frage

Entschuldigen Sie sich, dass Sie sich dafür entschuldigen, dass Sie etwas vielleicht ein bisschen übermäßig spezifisch gepostet haben, aber ich bin nicht sehr erfahren mit Swing und kann nicht gute Beispiele finden, die meinen Bedürfnissen entsprechen.

Daher versuche ich herauszufinden, wie am besten die A Dynamic GUI für die Auswahl der Filterkriterien im Swing implementiert werden:

Mockup of GUI to implement

Das zugrunde liegende Modell ist eine Klasse, die eine Liste von Kriterien enthält, die negiert werden können (dh mit einem Nicht-Prefix), und eine Eigenschaft, die angibt, ob diese mit und oder oder oder oder oder oder oder eine Eigenschaft angezeigt werden.

Die GUI würde es dem Benutzer ermöglichen, Kriterien hinzuzufügen, zu ändern oder zu entfernen und den Kombinationsoperator (und/oder) auszuwählen. Das erste Kriterium würde natürlich keinen Kombinationserwählers haben, und das dritte und nachfolgende Kriterium würde einfach denselben Kombinationsbeamten wie das zweite verwenden.

Die X-Buttons auf der rechten Seite würden verwendet, um ein Kriterium zu löschen. Wenn das Hinzufügen von Tasten gedrückt wird, würde nach unten eine neue Reihe von Komponenten hinzugefügt. Nachdem Änderungen vorgenommen werden, würden sich diese im zugrunde liegenden Modell widerspiegeln.

Natürlich könnte ich dies ziemlich "primitiv" implementieren, indem ich einfach Komponenten zu einem JPanel hinzufügt und das Modell entsprechend aktualisiere, aber ich würde eine ordentlichere Lösung bevorzugen, wie sie von einem Tablemodel bereitgestellt werden.

Ich frage mich also, ob eine Tabelle mit einem benutzerdefinierten Tablemodel und TableCellRenderer/Editor der beste Ansatz wäre oder ob es eine bessere Möglichkeit gibt, so etwas zu implementieren. Wenn Tabelle in der Tat der beste Ansatz ist, würde ich mir einige Hinweise darauf freuen, wie man TableCellRenderers oder -Ditoren verwenden würde, um dies zu erreichen.

Danke im Voraus.

War es hilfreich?

Lösung

Nur ein Beispiel: Alles ist hartcodiert, zum guten Verständnis

BEARBEITEN:

Wie Kleopatras bemerkte, bewegte JTable#FireTableDableDatachanged () von ActionListener in das Tablemodel, geändert alle Klassennamen, die mit Kleinbuchstaben beginnen

import java.awt.*;
import java.awt.event.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.table.*;

public class ComponentTableTest {

    private JFrame frame;
    private JTable CompTable = null;
    private CompTableModel CompModel = null;
    private JButton addButton = null;

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ComponentTableTest().makeUI();
            }
        });
    }

    public void makeUI() {
        CompTable = CreateCompTable();
        JScrollPane CompTableScrollpane = new JScrollPane(CompTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        JPanel bottomPanel = CreateBottomPanel();
        frame = new JFrame("Comp Table Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(CompTableScrollpane, BorderLayout.CENTER);
        frame.add(bottomPanel, BorderLayout.SOUTH);
        frame.setPreferredSize(new Dimension(800, 400));
        frame.setLocation(150, 150);
        frame.pack();
        frame.setVisible(true);
    }

    public JTable CreateCompTable() {
        CompModel = new CompTableModel();
        CompModel.addRow();
        JTable table = new JTable(CompModel);
        table.setRowHeight(new CompCellPanel().getPreferredSize().height);
        table.setTableHeader(null);
        CompCellEditorRenderer compCellEditorRenderer = new CompCellEditorRenderer();
        table.setDefaultRenderer(Object.class, compCellEditorRenderer);
        table.setDefaultEditor(Object.class, compCellEditorRenderer);
        return table;
    }

    public JPanel CreateBottomPanel() {
        addButton = new JButton("Add Comp");
        addButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                Object source = ae.getSource();

                if (source == addButton) {
                    CompModel.addRow();
                    //CompModel.fireTableDataChanged(); // moved to TableModel
                }
            }
        });
        JPanel panel = new JPanel(new GridBagLayout());
        panel.add(addButton);
        return panel;
    }
}

class CompCellEditorRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {

    private static final long serialVersionUID = 1L;
    private CompCellPanel renderer = new CompCellPanel();
    private CompCellPanel editor = new CompCellPanel();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        renderer.setComp((Comp) value);
        return renderer;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        editor.setComp((Comp) value);
        return editor;
    }

    @Override
    public Object getCellEditorValue() {
        return editor.getComp();
    }

    @Override
    public boolean isCellEditable(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return false;
    }
}

class CompTableModel extends DefaultTableModel {

    private static final long serialVersionUID = 1L;

    @Override
    public int getColumnCount() {
        return 1;
    }

    public void addRow() {
        super.addRow(new Object[]{new Comp(0, 0, "", "")});
        //super.fireTableDataChanged();
    }
}

class Comp {

    int type;
    int relation;
    String lower;
    String upper;

    public Comp(int type, int relation, String lower, String upper) {
        this.type = type;
        this.relation = relation;
        this.lower = lower;
        this.upper = upper;
    }
}

class CompCellPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private JLabel labelWith = new JLabel("With ");
    private JComboBox typeCombo = new JComboBox(new Object[]{"height", "length", "volume"});
    private JComboBox relationCombo = new JComboBox(new Object[]{"above", "below", "between"});
    private JTextField lowerField = new JTextField();
    private JLabel labelAnd = new JLabel(" and ");
    private JTextField upperField = new JTextField();
    private JButton removeButton = new JButton("remove");

    CompCellPanel() {
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        relationCombo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                enableUpper(relationCombo.getSelectedIndex() == 2);
            }
        });
        enableUpper(false);
        removeButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JTable table = (JTable) SwingUtilities.getAncestorOfClass(JTable.class, (Component) e.getSource());
                int row = table.getEditingRow();
                table.getCellEditor().stopCellEditing();
                ((DefaultTableModel) table.getModel()).removeRow(row);
            }
        });
        add(labelWith);
        add(typeCombo);
        add(relationCombo);
        add(lowerField);
        add(labelAnd);
        add(upperField);
        add(Box.createHorizontalStrut(100));
        add(removeButton);
    }

    private void enableUpper(boolean enable) {
        labelAnd.setEnabled(enable);
        upperField.setEnabled(enable);
    }

    public void setComp(Comp Comp) {
        typeCombo.setSelectedIndex(Comp.type);
        relationCombo.setSelectedIndex(Comp.relation);
        lowerField.setText(Comp.lower);
        upperField.setText(Comp.upper);
        enableUpper(Comp.relation == 2);
    }

    public Comp getComp() {
        return new Comp(typeCombo.getSelectedIndex(), relationCombo.getSelectedIndex(), lowerField.getText(), upperField.getText());
    }
}

Andere Tipps

Ich denke, ein so benutzerdefinierter Tablemodel und TableCellRenderer/Editor ist die beste Wahl.http://download.oracle.com/javase/tutorial/uiswing/components/table.htmlDas wäre gut zu beginnen.

Fügen Sie alle Komponenten für ein Suchkriterium zu einem Panel hinzu und fügen Sie das spezifische Panel hinzu/entfernen Sie. Ich glaube nicht, dass ein Tischstoff hier eine gute Wahl ist.

Netbeans hat eine schöne Benutzeroberfläche, die etwas ähnelt, was Sie beschreiben:Task List Filter KeywordPanel

Warum nicht auf den Schultern von Riesen stehen? Die NetBeans -Panels sehen gut aus und funktionieren gut. Die Implementierung ist sogar sauber zwischen UI und Modellcode getrennt. Wenn ich in deinen Schuhen wäre (und es war Juni 2011), würde ich meine Lösung hier auf die Quelle stützen:

http://hg.netbeans.org/main/file/14d339767aef/tasklist.ui/src/org/netbeans/modules/tasklist/filter

KeywordPanel.java enthält diesen kryptischen Kommentar: "Die GUI basiert auf dem in Mozillas Mail -Tool".

Ich frage mich, was das sein könnte.

Entschuldigung für die späte Antwort.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top