JButton Search

BillyTsane

Mitglied
Ich möchte, dass wenn ich auf den Button "search" klicke, nur die Daten im SearchDetails auf den Fahrzeugtabelle gezeigt werden. Ich schicke den Frame und auch Coden dazu.


package de.hs_kl.oopr_22.fleet_manager;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

@SuppressWarnings("serial")
public class GUI extends JFrame {

protected static JComboBox<?> cmbDetailsVehiclesType = null;

private GUIActions fleetManagerActions;

private JTable tblVehicles;
private JTextField txtSearchZipcode;
private JTextField txtSearchLicensePlateNumber;
private JTextField txtDetailsLicensePlateNumber;
private JTextField txtLocationStreet;
private JTextField txtLocationName;
private JTextField txtLocationZipcode;
private JTextField txtLocationCity;
private JLabel lbDetailsVehicleId;
private JComboBox<?> cmbSearchVehicleType;
private JComboBox cmbDetailsLocation;

private JPanel contentPanel;
private JLabel lblSearchLicensePlateNumber;
private JPanel pnlDetailsVehicles;
private JLabel lblVehicleDetails;
private JLabel lblDetailsVehicleType;
private JLabel lblDetailsLicensePlateNumber;
private JLabel lblSearchEmptyCell;
private JSeparator hlnLocation;
private JLabel lblLocation;
private JPanel pnlLocation;
private JLabel lblLocationDisplayName;
private JLabel lblLocationStreet;
private JLabel lblLocationZipcode;
private JLabel lblLocationCity;
private JButton btnAddLocation;
private JButton btnSave;
private VehicleDatabase vehicleDatabase;
private Vehicle vehicle;
private LocationDatabase locationDatabase; // new

protected boolean isExistPlat;
// private static LocationField locationSaved;
private DefaultTableModel model = new DefaultTableModel();
private JTable jTable = new JTable(model);

private TableRowSorter<TableModel> rowSorter = new TableRowSorter<>(jTable.getModel());

private JTextField jtfFilter = new JTextField();
private JButton jbtFilter = new JButton("Filter");

/**
* Create the frame.
*/
@SuppressWarnings({ "unchecked", "static-access", "rawtypes" })
public GUI() {
// window
setTitle("Flottenmanager");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 828, 525);
contentPanel = new JPanel();
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPanel);
contentPanel.setLayout(null);

// Label panet title : Flottenmanager

JLabel lblApplicationTitle = new JLabel("Flottenmanager");
lblApplicationTitle.setFont(new Font("Tahoma", Font.PLAIN, 35));
lblApplicationTitle.setBounds(10, 10, 255, 43);
contentPanel.add(lblApplicationTitle);

JPanel pnlSearchVehicles = new JPanel();
pnlSearchVehicles.setBorder(null);
pnlSearchVehicles.setBounds(10, 63, 485, 43);
contentPanel.add(pnlSearchVehicles);

// TextField Kennzeichen

txtSearchLicensePlateNumber = new JTextField();
txtSearchLicensePlateNumber.setColumns(10);

txtSearchZipcode = new JTextField();
txtSearchZipcode.setColumns(10);
pnlSearchVehicles.setLayout(new GridLayout(2, 4, 0, 0));

// Label Kennzeichen

lblSearchLicensePlateNumber = new JLabel("Kennzeichen");
pnlSearchVehicles.add(lblSearchLicensePlateNumber);

// label Fahrzeugart

JLabel lblSearchVehicleType = new JLabel("Fahrzeugart");
pnlSearchVehicles.add(lblSearchVehicleType);

// Label Standort PLZ

JLabel lblSearchZipcode = new JLabel("Standort PLZ");
pnlSearchVehicles.add(lblSearchZipcode);

// TextField Kennzeichen

lblSearchEmptyCell = new JLabel(" ");
pnlSearchVehicles.add(lblSearchEmptyCell);
pnlSearchVehicles.add(txtSearchLicensePlateNumber);

// Combobox fahrzeugart

String[] fahrzeugart = { "Lkw", "Pkw", "Transporter" };
cmbSearchVehicleType = new JComboBox(fahrzeugart);
pnlSearchVehicles.add(cmbSearchVehicleType);
pnlSearchVehicles.add(txtSearchZipcode);

JButton btnSearch = new JButton("Suchen");
pnlSearchVehicles.add(btnSearch);
JButton jButton = new JButton();
jButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnSearch) {
// txtSearchLicensePlateNumber.setText(getName());

} else if (cmbSearchVehicleType.getSelectedItem() == "lkw") {
txtSearchLicensePlateNumber.setText(getName());
txtSearchZipcode.setText(getName());
} else if (cmbSearchVehicleType.getSelectedItem() == "pkw") {
txtSearchLicensePlateNumber.setText(getName());
txtSearchZipcode.setText(getName());
} else if (cmbSearchVehicleType.getSelectedItem() == "transporter") {
txtSearchLicensePlateNumber.setText(getName());
txtSearchZipcode.setText(getName());

// HIER KÖNNEN SIE WEITERE PARAMETER FÜR DIE SUCHE HINZUFÜGEN
fleetManagerActions.search(txtSearchLicensePlateNumber.getName());


}

}

});

JScrollPane pnlTable = new JScrollPane();
pnlTable.setBounds(10, 180, 485, 283);
contentPanel.add(pnlTable);

tblVehicles = new JTable();
tblVehicles.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tblVehicles.setBackground(Color.WHITE);
pnlTable.setViewportView(tblVehicles);
 

Anhänge

  • WhatsApp Image 2023-01-09 at 19.41.27.jpeg
    WhatsApp Image 2023-01-09 at 19.41.27.jpeg
    258 KB · Aufrufe: 2
Java:
package de.hs_kl.oopr_22.fleet_manager;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

@SuppressWarnings("serial")
public class GUI extends JFrame {

    protected static JComboBox<?> cmbDetailsVehiclesType = null;

    private GUIActions fleetManagerActions;

    private JTable tblVehicles;
    private JTextField txtSearchZipcode;
    private JTextField txtSearchLicensePlateNumber;
    private JTextField txtDetailsLicensePlateNumber;
    private JTextField txtLocationStreet;
    private JTextField txtLocationName;
    private JTextField txtLocationZipcode;
    private JTextField txtLocationCity;
    private JLabel lbDetailsVehicleId;
    private JComboBox<?> cmbSearchVehicleType;
    private JComboBox cmbDetailsLocation;

    private JPanel contentPanel;
    private JLabel lblSearchLicensePlateNumber;
    private JPanel pnlDetailsVehicles;
    private JLabel lblVehicleDetails;
    private JLabel lblDetailsVehicleType;
    private JLabel lblDetailsLicensePlateNumber;
    private JLabel lblSearchEmptyCell;
    private JSeparator hlnLocation;
    private JLabel lblLocation;
    private JPanel pnlLocation;
    private JLabel lblLocationDisplayName;
    private JLabel lblLocationStreet;
    private JLabel lblLocationZipcode;
    private JLabel lblLocationCity;
    private JButton btnAddLocation;
    private JButton btnSave;
    private VehicleDatabase vehicleDatabase;
    private Vehicle vehicle;
    private LocationDatabase locationDatabase; // new

    protected boolean isExistPlat;
    // private static LocationField locationSaved;
    private DefaultTableModel model = new DefaultTableModel();
    private JTable jTable = new JTable(model);

    private TableRowSorter<TableModel> rowSorter = new TableRowSorter<>(jTable.getModel());

    private JTextField jtfFilter = new JTextField();
    private JButton jbtFilter = new JButton("Filter");

    /**
     * Create the frame.
     */
    @SuppressWarnings({ "unchecked", "static-access", "rawtypes" })
    public GUI() {
        // window
        setTitle("Flottenmanager");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 828, 525);
        contentPanel = new JPanel();
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));

        setContentPane(contentPanel);
        contentPanel.setLayout(null);

        // Label panet title : Flottenmanager

        JLabel lblApplicationTitle = new JLabel("Flottenmanager");
        lblApplicationTitle.setFont(new Font("Tahoma", Font.PLAIN, 35));
        lblApplicationTitle.setBounds(10, 10, 255, 43);
        contentPanel.add(lblApplicationTitle);

        JPanel pnlSearchVehicles = new JPanel();
        pnlSearchVehicles.setBorder(null);
        pnlSearchVehicles.setBounds(10, 63, 485, 43);
        contentPanel.add(pnlSearchVehicles);

        // TextField Kennzeichen

        txtSearchLicensePlateNumber = new JTextField();
        txtSearchLicensePlateNumber.setColumns(10);

        txtSearchZipcode = new JTextField();
        txtSearchZipcode.setColumns(10);
        pnlSearchVehicles.setLayout(new GridLayout(2, 4, 0, 0));

        // Label Kennzeichen

        lblSearchLicensePlateNumber = new JLabel("Kennzeichen");
        pnlSearchVehicles.add(lblSearchLicensePlateNumber);

        // label Fahrzeugart

        JLabel lblSearchVehicleType = new JLabel("Fahrzeugart");
        pnlSearchVehicles.add(lblSearchVehicleType);

        // Label Standort PLZ

        JLabel lblSearchZipcode = new JLabel("Standort PLZ");
        pnlSearchVehicles.add(lblSearchZipcode);

        // TextField Kennzeichen

        lblSearchEmptyCell = new JLabel(" ");
        pnlSearchVehicles.add(lblSearchEmptyCell);
        pnlSearchVehicles.add(txtSearchLicensePlateNumber);

        // Combobox fahrzeugart

        String[] fahrzeugart = { "Lkw", "Pkw", "Transporter" };
        cmbSearchVehicleType = new JComboBox(fahrzeugart);
        pnlSearchVehicles.add(cmbSearchVehicleType);
        pnlSearchVehicles.add(txtSearchZipcode);

        JButton btnSearch = new JButton("Suchen");
        pnlSearchVehicles.add(btnSearch);
        JButton jButton = new JButton();
        jButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == btnSearch) {
                    // txtSearchLicensePlateNumber.setText(getName());

                } else if (cmbSearchVehicleType.getSelectedItem() == "lkw") {
                    txtSearchLicensePlateNumber.setText(getName());
                    txtSearchZipcode.setText(getName());
                } else if (cmbSearchVehicleType.getSelectedItem() == "pkw") {
                    txtSearchLicensePlateNumber.setText(getName());
                    txtSearchZipcode.setText(getName());
                } else if (cmbSearchVehicleType.getSelectedItem() == "transporter") {
                    txtSearchLicensePlateNumber.setText(getName());
                    txtSearchZipcode.setText(getName());

                    // HIER KÖNNEN SIE WEITERE PARAMETER FÜR DIE SUCHE HINZUFÜGEN
                    fleetManagerActions.search(txtSearchLicensePlateNumber.getName());
                    
                    
                }

            }

        });

        JScrollPane pnlTable = new JScrollPane();
        pnlTable.setBounds(10, 180, 485, 283);
        contentPanel.add(pnlTable);

        tblVehicles = new JTable();
        tblVehicles.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tblVehicles.setBackground(Color.WHITE);
        pnlTable.setViewportView(tblVehicles);
 
// txtSearchLicensePlateNumber.setText(getName());
An der Stelle solltest du mit der Suche beginnen.
Geh die Tabelle zeilenweise durch, schau, ob der Wert übereinstimmt.
Falls ja, dann markier die Zeile mit setRowSelectionInterval


ps: Deine Auswertung der Combobox ist ... fragwürdig
1. Texte vergleicht man nicht mit "==", sontern mit equals oder equalsIgnoreCase. Der "==" Vergleich vergleicht die Speicheradresse, nicht aber den Text. Diese kann natürlich die gleiche sein, muss sie aber nicht, vor allem nicht bei Texten, die zur Laufzeit erstellt werden.
2. Warum verwendest du einen Actionlistener für die Combobox?
Solltest du nicht auf die Auswahl reagieren anstatt auf Maus-/Tastatureingaben? Ein ItemListener wäre hier angebracht.
3. für die Auswertung bietet sich hier ein switch statement an.
Code:
//Geht in neueren Java-Varianten noch eleganter, aber bleib mal dabei.
if (cmbSearchVehicleType.getSelectedItem() !=  null) {
    switch (cmbSearchVehicleType.getSelectedItem()) {
            case "lkw": {
                //...
                break;
            }
            case "pkw": {
                //...
                break;
            }
            case "transporter": {
                //...
                break;
            }
            default: {
            
            }
    }
}
 
Hier auch aufpassen, was man prüft! Du setzt z.B. "Pkw" und prüfst auf "pkw" - und das sind zwei unterschiedliche Strings. Sowas würde ich generell als Konstante definieren um dann diese Konstanten zu nutzen. Prinzipiell wäre hier auch die Verwendung von einer Enumeration denkbar.

Wenn die Strings gleich gewesen wären (also beide z.B. "Pkw"), dann hätte der Vergleich sogar geklappt, da String Literale alle zu genau einer String Instanz werden. (Aber dennoch sollte man das so nicht machen! Der Hinweis von @Neumi5694 ist existenziell!)
 
// txtSearchLicensePlateNumber.setText(getName());
An der Stelle solltest du mit der Suche beginnen.
Geh die Tabelle zeilenweise durch, schau, ob der Wert übereinstimmt.
Falls ja, dann markier die Zeile mit setRowSelectionInterval


ps: Deine Auswertung der Combobox ist ... fragwürdig
1. Texte vergleicht man nicht mit "==", sontern mit equals oder equalsIgnoreCase. Der "==" Vergleich vergleicht die Speicheradresse, nicht aber den Text. Diese kann natürlich die gleiche sein, muss sie aber nicht, vor allem nicht bei Texten, die zur Laufzeit erstellt werden.
2. Warum verwendest du einen Actionlistener für die Combobox?
Solltest du nicht auf die Auswahl reagieren anstatt auf Maus-/Tastatureingaben? Ein ItemListener wäre hier angebracht.
3. für die Auswertung bietet sich hier ein switch statement an.
Code:
//Geht in neueren Java-Varianten noch eleganter, aber bleib mal dabei.
if (cmbSearchVehicleType.getSelectedItem() !=  null) {
    switch (cmbSearchVehicleType.getSelectedItem()) {
            case "lkw": {
                //...
                break;
            }
            case "pkw": {
                //...
                break;
            }
            case "transporter": {
                //...
                break;
            }
            default: {
           
            }
    }
}
Die getSelectedItem habe ich versucht aber geht nicht!
 
Hier auch aufpassen, was man prüft! Du setzt z.B. "Pkw" und prüfst auf "pkw" - und das sind zwei unterschiedliche Strings. Sowas würde ich generell als Konstante definieren um dann diese Konstanten zu nutzen. Prinzipiell wäre hier auch die Verwendung von einer Enumeration denkbar.

Wenn die Strings gleich gewesen wären (also beide z.B. "Pkw"), dann hätte der Vergleich sogar geklappt, da String Literale alle zu genau einer String Instanz werden. (Aber dennoch sollte man das so nicht machen! Der Hinweis von @Neumi5694 ist existenziell!)
Wie könnte eine Enumeration hier gemacht werden bitte?
 
Wie könnte eine Enumeration hier gemacht werden bitte?
Du kannst eine Enumeration bauen und dann die JComboBox einfach mit den Werten MyEnumeration.values() füllen. (MyEnumeration muss natürlich der Name der Enumeration sein)

Wenn Du die Werte noch besser darstellen willst, dann kannst Du noch die toString Methode überschreiben um halt nur das erste Zeichen groß und den Rest klein zu haben.

Die getSelectedItem habe ich versucht aber geht nicht!
Das dürfte daran liegen, dass getSelectedItem erst einmal ein Object zurück gibt und das ist für ein Switch nicht zulässig. Da Du aber weisst, dass es ein String ist, wäre ein Cast zu String möglich. Oder man ruft toString() auf.
switch((String) cmbSearchVehicleType.getSelectedItem()) {`

Hier ist auch immer wichtig: "geht nicht" besagt nichts. Du bekommst ja eine Fehlermeldung und die solltest Du auch konkret angeben!
 
Die getSelectedItem habe ich versucht aber geht nicht!
Sorry, war von meinen eigenen Hilfsmethoden etwas verwöhnt, da hab ich mir den Cast mit eingebaut. getSelectedItem liefert ein Object, welches erst noch gecastet werden muss.
Die Schreibung ist wie von @KonradN erwähnt natürlich auch wichtig. switch / case verwendet equals() für den Vergleich, die Schreibung wird also berücksichtigt. Will man das Ganze hingegen case-Unabhängig müsste man den ausgelesenen Wert noch mit toLowerCase() in Kleinbuchstaben umwandeln und auch mit solchen vergleichen.

Ein Enum ist in jedem Fall zu bevorzugen, das mache ich immer, bei mir gibt's keine Komboboxen mit Strings, schon allein, damit das Ganze sprachunabhängig wird.
Der Renderer für die Combobox bestimmt dann, was für welches Enum angezeigt wird. Alternativ muss sich die toString() Methode der Enum-Werte darum kümmern.
 

Zurück
Oben