2 ComboBox(en)

Bitte aktiviere JavaScript!
Ok, dann musst Du die JTable mit dem BranchModel irgendwo initialisieren.
Mache ich das nicht schon im Panel hiermit?
Java:
jTableFilialen_Deutschland.setModel(new BranchModel(branchRepos, Location.DOMESTIC));
Oder meinst du sowas?
Java:
    public PanelBranchesDomestic(BranchRepository branchRepos, BranchModel branchModel) {
        this.branchRepos = branchRepos;
        this.branchModel = new BranchModel(branchRepos, Location.DOMESTIC);
        initComponents();
        jTableFilialen_Deutschland.setModel(branchModel);
    }
   
    BranchRepository branchRepos = null;
    BranchModel branchModel = null;
 
Du hast also ein EditData-Frame, das z. B. ein PanelBranchesDomestic enthält, richtig? In Kommentar #156 fehlt mir die Stelle, an der Du das PanelBranchesDomestic erzeugst.

Im Konstruktor von PanelBranchesDomestic brauchst Du das branchModel nicht nochmal erstellen - Du bekommst es ja schon als Parameter.
 
Ah auf so eine ähnliche Idee kam ich auch gerade; ich habe die Panels als Datei erstellt, dann einmal auf Compile File geklickt und dann mit Drag and Drop in das TabbedPane von EditData gezogen - mehr habe ich nicht gemacht. Ich sehe gerade in der initComponent Methode wird nur der Standardkonstruktor aufgerufen. Kann es sein, dass ich den Allgemeinen aufrufen muss, mit unseren Anpassungen?

Sowas?
Java:
panelBranchesDomestic = new UserInterface.PanelBranchesDomestic(branchRepos);
initComponents:
Java:
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {

        jButton5 = new javax.swing.JButton();
        jTabbedPane = new javax.swing.JTabbedPane();
        panelBranchesDomestic = new UserInterface.PanelBranchesDomestic();
        panelBranchesForeign = new UserInterface.PanelBranchesForeign();
        panelCompanyNames = new UserInterface.PanelCompanyNames();
        panelTitels = new UserInterface.PanelTitels();
        panelRoles1 = new UserInterface.PanelRoles();
        jButton8 = new javax.swing.JButton();
        jLabelDBPath = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new java.awt.Dimension(1082, 587));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        jButton5.setIcon(new javax.swing.ImageIcon("C:\\Users\\david\\Documents\\back-icon.png")); // NOI18N
        jButton5.setText("Zurück zum Hauptfenster");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        jTabbedPane.addTab("Filialen_Deutschland", panelBranchesDomestic);
        jTabbedPane.addTab("Filialen_Ausland", panelBranchesForeign);
        jTabbedPane.addTab("Firmierungen", panelCompanyNames);
        jTabbedPane.addTab("Titel", panelTitels);
        jTabbedPane.addTab("Funktionen", panelRoles1);

        jButton8.setIcon(new javax.swing.ImageIcon("C:\\Users\\david\\Documents\\My-Documents-icon.png")); // NOI18N
        jButton8.setText("Datenbank laden");
        jButton8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton8ActionPerformed(evt);
            }
        });

        jLabelDBPath.setText(" ");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton5)
                .addGap(18, 18, 18)
                .addComponent(jButton8)
                .addGap(121, 121, 121)
                .addComponent(jLabelDBPath)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addComponent(jTabbedPane)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton5)
                    .addComponent(jButton8)
                    .addComponent(jLabelDBPath))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 534, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>  

    // Variables declaration - do not modify                    
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton8;
    private javax.swing.JLabel jLabelDBPath;
    private javax.swing.JTabbedPane jTabbedPane;
    private UserInterface.PanelBranchesDomestic panelBranchesDomestic;
    private UserInterface.PanelBranchesForeign panelBranchesForeign;
    private UserInterface.PanelCompanyNames panelCompanyNames;
    private UserInterface.PanelRoles panelRoles1;
    private UserInterface.PanelTitels panelTitels;
    // End of variables declaration
 
Zuletzt bearbeitet:
Kann es sein, dass ich den Allgemeinen aufrufen muss, mit unseren Anpassungen?
Jawoll. Du kannst im UI Builder in den Properties bei "custom creation" (oder so ähnlich) angeben, wie die Komponente erstellt werden solll. Dort schreibst Du "new UserInterface.PanelBranchesDomestic(branch, branches);" rein (hoffe, die Namen stimmen noch). Dann sollte das so in initComponents übernommen werden.
 
Ah cool!

Moment, im Allgemeinen Konstruktor von PanelBranchDomestic habe ich aktuell nur (BranchRepository branchRepos) als Übergabeparamenter. Das mit dem Model war nur geraten :D Oder müssen da wirklich zwei Parameter rein?

Also:
Java:
//Klasse des Panels
public class PanelBranchesDomestic extends javax.swing.JPanel {

    public PanelBranchesDomestic() {
        initComponents();
    }
    
    public PanelBranchesDomestic(BranchRepository branchRepos) {
        this.branchRepos = branchRepos;
        initComponents();
        jTableFilialen_Deutschland.setModel(new BranchModel(branchRepos, Location.DOMESTIC));       
    }
    
    BranchRepository branchRepos = null;
    
    private void initComponents() {
        //...
    }
    
    //Variable declaration ...
}

//Klasse des EditData Fensters
public class EditData extends javax.swing.JFrame {

    public EditData() {
        branchRepos = new BranchRepository(conn);
        initComponents();
        setLocationRelativeTo(null);
        setResizable(false);
        ConnectDb();
    }
    
    Connection conn = null;
    BranchRepository branchRepos = null;
    
    private Connection ConnectDb() {
        try {
            conn = DriverManager.getConnection("jdbc:sqlite:" + System.getProperty("user.home") + "/Desktop/KERN_Standorte_Adressen.db");
            return conn;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex);
            return null;
        }
    }
    
    private void initComponents() {
        panelBranchesDomestic = new UserInterface.PanelBranchesDomestic(branchRepos);
        //...
    }
    
    private UserInterface.PanelCompanyNames panelCompanyNames;
    //..

}
Bekomme so aber leider wieder eine Nullpointer:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at RepositoryClasses.BranchRepository.findAll(BranchRepository.java:75)
    at ModelClasses.BranchModel.<init>(BranchModel.java:42)
    at UserInterface.PanelBranchesDomestic.<init>(PanelBranchesDomestic.java:29)
    at UserInterface.EditData.initComponents(EditData.java:70)
    at UserInterface.EditData.<init>(EditData.java:25)
    at UserInterface.EditData$4.run(EditData.java:188)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Java:
//at RepositoryClasses.BranchRepository.findAll(BranchRepository.java:75)
try(PreparedStatement pst = conn.prepareStatement(sql)) {

//at ModelClasses.BranchModel.<init>(BranchModel.java:42)
data = branches.findAll(location);

//at UserInterface.PanelBranchesDomestic.<init>(PanelBranchesDomestic.java:29)
jTableFilialen_Deutschland.setModel(new BranchModel(branchRepos, Location.DOMESTIC));   

//at UserInterface.EditData.initComponents(EditData.java:70)
panelBranchesDomestic = new UserInterface.PanelBranchesDomestic(branchRepos);

//at UserInterface.EditData.<init>(EditData.java:25)
initComponents();

//at UserInterface.EditData$4.run(EditData.java:188)
new EditData().setVisible(true);
 
Cool, es funktioniert inzwischnen :D

Wie kann ich denn in der Struktur jetzt mit der setCurrent Methode das entsprechend handhaben? Also in der Klasse BranchViewDomestic habe ich die setCurent drin, wo die entsprechenden Texfelder gesetzt werden. Die Methode benötigt aos Übergabe ein Objekt vom Typ Branch. Von der Struktur her bräuchte ich jetzt eine Methode in BranchModel oder? Kann ich mir da was aus den abstrakten Methoden des BranchModels was basteln?
Habe gesehen, dass du bei PersonView das beim erstellen der Tabelle geschrieben hast, davon versehe ich aber nicht alles:

Java:
    private JTable createTable() {
        JTable table = new JTable(persons);
        table.getSelectionModel().addListSelectionListener(e -> {
            if (e.getValueIsAdjusting()) {
                return;
            }
            int row = table.getSelectedRow();
            setCurrent(row != -1 ? persons.getElementAt(row) : null);
        });       
        setCurrent(null);
        return table;
    }
Den ListSelectionListener brauche ich ja nicht mehr oder? Also, weil ich jetzt EventMouseOver und EventKeyReleased benutze
 
Also in der Klasse BranchViewDomestic habe ich die setCurent drin, wo die entsprechenden Texfelder gesetzt werden
Mal eine doofe Frage: unterscheiden sich BranchViewDomestic und BranchViewForeign irgendwie (mal von der Location abgesehen)? Wenn nein, wäre es Zeit für ein Refactoring: BranchView mit Location als Parameter :)

Ansonsten: setCurrent bekommt ein Branch-Objekt und setzt die Textfelder. Was willst Du da noch basteln?

Nachtrag: habe gerade BranchView mit den Panels verwechselt. Wenn ich mich recht entsinne, war das die Klasse, deren Methode Du ins Panel übernehmen kannst.
 
Mal eine doofe Frage: unterscheiden sich BranchViewDomestic und BranchViewForeign irgendwie (mal von der Location abgesehen)? Wenn nein, wäre es Zeit für ein Refactoring: BranchView mit Location als Parameter :)
Im Prinzip nicht, allerdings gibt es für DOMESTIC und FOREIGN jeweils eine andere JTabel (jTableFilialen_Deutschland und jTableFilialen_Ausland). Das heißt in der setCurrent Methode setze ich ja String Werte für die die 11 JTextFields. In den jTableFilialen_Deutschland heißen die Felder jTextFieldD1 bis jTextFieldD11 und bei jTableFilialen_Ausland dann jTextFieldA1 bis jTextFieldA11. Alternativ könnte ich mir die setCurrent Methode auch sparen und mir in die GUI Methode schreiben, aber dann kann hab ich ja nicht mehr diese schöne Verschachtelung ^^
Ansonsten: setCurrent bekommt ein Branch-Objekt und setzt die Textfelder. Was willst Du da noch basteln?

Nachtrag: habe gerade BranchView mit den Panels verwechselt. Wenn ich mich recht entsinne, war das die Klasse, deren Methode Du ins Panel übernehmen kannst.
Ja genau, aber wie bekomme ich jetzt an das Branch Objekt ran? Mache ich das mit SelectedRow von der JTable?
 
Wenn Deine Panels identisch sind, kannst Du eine Klasse draus machen. Du musst ja nur zwei Instanzen davon erstellen, einmal mit Location.DOMESTIC und einmal mit Location.FOREIGN. In dem Panel heißen die Felder dann neutral. Die View-Klasse kannst Du Dir sparen, weil setCurrent ja gerade dazu dient, die Textfelder zu setzen. Das Branch-Objekt bekommst Du vom BranchModel über die ausgewählte Zeile der Tabelle.
 
In dem Panel heißen die Felder dann neutral
Das versteht ich nicht, geht sowas?
Java:
    private void jTableFilialen_DeutschlandKeyReleased(java.awt.event.KeyEvent evt) {                                                       
        if(evt.getKeyCode() == KeyEvent.VK_UP || evt.getKeyCode() == KeyEvent.VK_DOWN) {
            int row = jTableFilialen_Deutschland.getSelectedRow();
            Branch branch = branchModel.getElementAt(row);
            branchView.setCurrent(branch);
        }
    }
So in etwa?
 
Das, was in Deinem if-Zweig ist: genau.

Zwei Dinge:
1. warum willst Du einen KeyListener verwenden?
2. zum Thema neutrale Bezeichnung. Mal in mehreren Absätzen:

Aktuell hast Du ja ein "Deutschland-Panel" und ein "Auslands-Panel". Du kannst innerhalb der beiden Panels die Felder neutral bezeichnen, weil ja durch die Klasse schon klar ist, ob Deutschland oder Ausland.

Sprich: statt jTableFilialen_Deutschland nennst Du das Feld einfach jTableFilialen.

Wenn dann die Panels auch noch identisch sind, kannst Du eines in die Tonne treten. Dann machst Du z. B. aus PanelBranchesDomestic einfach nur ein PanelBranches und gibst im Konstruktor die Location mit. In EditData erzeugst Du dann einfach zwei PanelBranches - jeweils mit der betreffenden Location.
 
1. warum willst Du einen KeyListener verwenden?
Weil ich keine anderen Möglichkeit kenne, um die Texfelder mit den Werten zu belegen, wenn man mit den Pfeiltasten hoch und runter geht. Es ist auch noch ein MouseClicked vorgesehen, oder hast du eine andere Idee?

zu 2. das würde ich später noch machen, jeztzt hab ich schon wieder ne NullPointer bei dem Code oben:mad:
 
Java:
import javax.swing.*;
import javax.swing.table.*;

public class Test {
    public void run() {
        TableModel dataModel = new AbstractTableModel() {
            public int getColumnCount() { return 10; }
            public int getRowCount() { return 10;}
            public Object getValueAt(int row, int col) { return new Integer(row*col); }
        };
        JTable table = new JTable(dataModel);
        table.setRowSelectionAllowed(true);
        table.getSelectionModel().addListSelectionListener(e -> {
            if (e.getValueIsAdjusting()) {
                return;
            }
            System.out.println(table.getSelectedRow());
        });
        JScrollPane scrollpane = new JScrollPane(table);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollpane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Ah cool, das ist natürlich was Feines :D

Java:
    private void tableListener() {
        table.setRowSelectionAllowed(true);
        table.getSelectionModel().addListSelectionListener(e -> {
            if (e.getValueIsAdjusting()) {
                return;
            }
            //System.out.println(table.getSelectedRow() + 1);
            int row = table.getSelectedRow() + 1;
            branch = branchModel.getElementAt(row);
            branchView.setCurrent(branch);
        });   
    }
komischerweise ist die Zahl immer um 1 zu klein gewesen.

In der Zeile branchView.setCurrent(branch); bekomme ich aber wieder eine NullPointer Ex. Ich vermute mal das an der Methode was falsch ist;
Java:
  public void setCurrent(Branch branch) {
        this.current = branch;
        boolean valid = current != null;
        if (valid) {
            panel.jTextFieldD1.setText("" + current.getId());
            panel.jTextFieldD2.setText(current.getLabel());
            panel.jTextFieldD3.setText(current.getStrasze());
            panel.jTextFieldD4.setText(current.getPlzort());       
            panel.jTextFieldD5.setText(current.getOrt());
            panel.jTextFieldD8.setText("" + current.getVorwahl());
            panel.jTextFieldD6.setText("" + current.getTelStartNum());
            panel.jTextFieldD7.setText(current.getTelStartTxt());
            panel.jTextFieldD9.setText("" + current.getTelEndDefault());
            panel.jTextFieldD10.setText(current.getFaxStartTxt());
            panel.jTextFieldD11.setText(current.getFaxEndTxt());
        } else {
            panel.jTextFieldD1.setText("");
            panel.jTextFieldD2.setText("");
            panel.jTextFieldD3.setText("");
            panel.jTextFieldD4.setText("");       
            panel.jTextFieldD5.setText("");
            panel.jTextFieldD8.setText("");
            panel.jTextFieldD6.setText("");
            panel.jTextFieldD9.setText("");
            panel.jTextFieldD10.setText("");
            panel.jTextFieldD11.setText("");
        }
        panel.jTextFieldD1.setEnabled(valid);
        panel.jTextFieldD2.setEnabled(valid);
        panel.jTextFieldD3.setEnabled(valid);
        panel.jTextFieldD4.setEnabled(valid);     
        panel.jTextFieldD5.setEnabled(valid);
        panel.jTextFieldD8.setEnabled(valid);
        panel.jTextFieldD6.setEnabled(valid);
        panel.jTextFieldD7.setEnabled(valid);
        panel.jTextFieldD9.setEnabled(valid);
        panel.jTextFieldD10.setEnabled(valid);
        panel.jTextFieldD11.setEnabled(valid);
        panel.jButtonUpdateD.setEnabled(valid);
        panel.jButtonSaveD.setEnabled(valid);
        panel.jButtonDeleteD.setEnabled(valid);   
    }
Es wird halt kein Fehler angezeigt :O
 
Wie meinst Du das? Die Indizes beginnen wie üblich mit 0, erste Zeile ist also 0.
naja bei dem System.out.printLine.. kommt immer eine Zahl die sonst um 1 zu klein ist.
Wenn Du in der Zeile eine NPE bekommst, muss branchView == null gelten.
Jo, das geht aber gar nicht eigentlich. Sonst müsste auch ja schon das Anzeigen der Werte in der Tabelle nicht klappen. Gut, dort habe ich BranchViewDomestic gar nicht benutzt. Aber auch durch setzen von
Java:
BranchViewDomestic branchView = new BranchViewDomestic(branchModel);
kommt noch NullPointer :rolleyes:
 
Schau Dir den Stacktrace nochmal genau an. Wenn die NPE wirklich originär in der Zeile entsteht, muss branchView == null gelten -> das geht nicht anders. Evtl. passiert es aber innerhalb der BranchViewDomestic, das würdest Du dann aber im Stacktrace sehen.
 
ja, da steht das hier:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ModelClasses.BranchViewDomestic.setCurrent(BranchViewDomestic.java:40)
    at UserInterface.PanelBranchesDomestic.lambda$tableListener$0(PanelBranchesDomestic.java:61)
Ich vermute auch, dass es an der setCurrent Methode liegt, aber dann dürfe es eigentlich keine NullPointer sein, sondern irgendeine andere Exception. Zeile 40 macht das hier:
Java:
panel.jTextFieldD1.setText("" + current.getId());
sehe ich kein Fehler drin.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben