Brak reakcji w JFrame

0

Piszę program w swingu łączący się z bazą danych. Mam jedno główne okno w którym między innymi mam tabele w której będą wyświetlane informacje pobierane z bazy oraz JButton'a który powoduje pojawienie się nowego okna w którym tworzę nową bazę danych. Jeże po skompilowaniu kliknę JButtona aby wyświetlił informacje w tabeli z bazy X to to robi, potem klikam JButtona aby dodać nową bazę Y. Podaje nazwe, tworzę baze i wszystko jest ok ale jeżeli jeszcze raz na nowo otworzę program i najpierw utworzę nową bazę Y (dodatkowe okno zostaje zamnkięte) wracam do głównego okna i wtedy chce wyświetlić w tabeli informacje z bazy X to już tego nie robi. Tak samo mam z JComboBox (mimo, że dodaje kolejny element to nie jest on już wyświetlany). Ktoś wie czym to może być spowodowane?

0

To jest forum programistów a nie jasnowidzów ;) Jezeli ktos ma Ci pomoc to powinenes wstawic kod, inaczej nigdy Ci nie powiemy co powoduje blad

0
public class KelnerProjekt {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                MainFrame mainFrame = new MainFrame();
                mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                mainFrame.setVisible(true);
            }
        });
    }
}

class MainFrame extends JFrame{
    public MainFrame(){
        setTitle("Obsługa stolików w Restauracji");
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
  
        mainPanel = new JPanel();
        mainPanel.setBackground(new Color(142, 148, 208));
        title = new JLabel();
        title.setFont(new Font("Tempus Sans ITC", 1, 24)); 
        title.setText("Obsługa stolików w Restauracji");
        bottomPanel = new JPanel();
        addPerson = new JButton("Dodaj kelnera");
        choosePersonLabel = new JLabel("Wybór kelnera:");
        choosePerson = new JComboBox();
        choosePerson.setModel(new DefaultComboBoxModel(new String[] { "Monika", "Jan" }));
        choosePerson.setEditable(true);
        showTables = new JButton("Pokaż stoliki");
        jScrollPane1 = new JScrollPane();
  
        billTable = new JTable();
        billTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null},{null, null, null},{null, null, null},{null, null, null},
                {null, null, null},{null, null, null},{null, null, null},{null, null, null},
                {null, null, null},{null, null, null},{null, null, null},{null, null, null},
                {null, null, null},{null, null, null},{null, null, null},{null, null, null},
                {null, null, null},{null, null, null},{null, null, null},{null, null, null},
                {null, null, null},{null, null, null},{null, null, null},{null, null, null},
                {null, null, null}
            },
            new String [] {
                "Nazwa Rachunku", "Nr stolika", "Kwota"
            }
        ));
        jScrollPane1.setViewportView(billTable);
        
        
        addPerson.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                if(dialog == null)
                    dialog = new NewPerson(MainFrame.this);
                dialog.setVisible(true);
            }
        });

        showTables.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
           
                String polaczenieURL = "jdbc:mysql://localhost/test?user=root&password=admin";
                //Tworzymy proste zapytanie doa bazy danych
                String query = "Select * FROM pracownicy";
               
                Connection conn = null;
        
                try {
                    //Ustawiamy dane dotyczące podłączenia
                    conn = DriverManager.getConnection(polaczenieURL);
                       
                    //Ustawiamy sterownik MySQL
                    Class.forName("com.mysql.jdbc.Driver");
                       
                    //Uruchamiamy zapytanie do bazy danych
                    Statement stmt = conn.createStatement();
                    ResultSet rs = stmt.executeQuery(query);
                  
                    while (rs.next()) {
                        wyswietlDaneZBazy(rs); 
                    }
                    conn.close();
                }
                //Wyrzuć wyjątki jężeli nastąpią błędy z podłączeniem do bazy danych lub blędy zapytania o dane
                catch(ClassNotFoundException wyjatek) {
                        System.out.println("Problem ze sterownikiem");
                }
 
                catch(SQLException wyjatek) {
                    //e.printStackTrace();
                    //System.out.println("Problem z logowaniem\nProsze sprawdzic:\n nazwę użytkownika, hasło, nazwę bazy danych lub adres IP serwera");
                    System.out.println("SQLException: " + wyjatek.getMessage());
                    System.out.println("SQLState: " + wyjatek.getSQLState());
                    System.out.println("VendorError: " + wyjatek.getErrorCode());
                }  
            }
        });
        
        GroupLayout bottomPanelLayout = new GroupLayout(bottomPanel);
        bottomPanel.setLayout(bottomPanelLayout);
        bottomPanelLayout.setHorizontalGroup(
            bottomPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(bottomPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(bottomPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                    .addComponent(addPerson, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(choosePersonLabel)
                    .addComponent(choosePerson, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(showTables, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(36, Short.MAX_VALUE))
        );
        bottomPanelLayout.setVerticalGroup(
            bottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(bottomPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(addPerson, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(choosePersonLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(choosePerson, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(showTables)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addGap(285, 285, 285)
                        .addComponent(title)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(bottomPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(40, 40, 40)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 699, Short.MAX_VALUE)))
                .addContainerGap())
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(title)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(bottomPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 60, Short.MAX_VALUE)))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(mainPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack(); 
    }
    
    static void wyswietlDaneZBazy(ResultSet rs){
        try {
            daneZBazy = rs.getString(1);
            billTable.setValueAt(daneZBazy, zmiennaPom, 0);
            daneZBazy = rs.getString(2);
            billTable.setValueAt(daneZBazy, zmiennaPom, 1);
            daneZBazy = rs.getString(3);
            billTable.setValueAt(daneZBazy, zmiennaPom, 2);
            zmiennaPom += 1;
        } 
        catch(SQLException e) {
            e.printStackTrace();
        }
    }
    
    static int zmiennaPom = 0;
    static String daneZBazy;
    private JButton addPerson;
    private JPanel bottomPanel;
    public JComboBox choosePerson;
    private JLabel choosePersonLabel;
    private JScrollPane jScrollPane1;
    static private JTable billTable;
    public JPanel mainPanel;
    private JButton showTables;
    private JLabel title;
    private NewPerson dialog;
            
}

class NewPerson extends JDialog {
    public NewPerson(JFrame owner){
        super(owner, "Dodaj nowego kelnera", true);
        addPanel = new JPanel();
        addPersonLabel = new JLabel("Podaj nazwe nowego kelnera");
        addPersonTextField = new JTextField();
        addPerson = new JButton("Dodaj");
        addPerson.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                nameWaiter = addPersonTextField.getText();
                
                String polaczenieURL = "jdbc:mysql://localhost/test?user=root&password=admin";
                //Tworzymy proste zapytanie doa bazy danych
                String query = "CREATE TABLE " + nameWaiter + " (Nazwa_Stolika CHAR(20), Nr_stolika INT(3), Kwota DOUBLE(3,2) )";
               
                Connection conn = null;
        
                try {
                    //Ustawiamy dane dotyczące podłączenia
                    conn = DriverManager.getConnection(polaczenieURL);
                       
                    //Ustawiamy sterownik MySQL
                    Class.forName("com.mysql.jdbc.Driver");
                       
                    //Uruchamiamy zapytanie do bazy danych
                    Statement stmt = conn.createStatement();
                    stmt.executeUpdate(query);
                  
                    conn.close();
                }
                //Wyrzuć wyjątki jężeli nastąpią błędy z podłączeniem do bazy danych lub blędy zapytania o dane
                catch(ClassNotFoundException wyjatek) {
                        System.out.println("Problem ze sterownikiem");
                }
 
                catch(SQLException wyjatek) {
                    System.out.println("SQLException: " + wyjatek.getMessage());
                    System.out.println("SQLState: " + wyjatek.getSQLState());
                    System.out.println("VendorError: " + wyjatek.getErrorCode());
                }
                
                MainFrame obiekt = new MainFrame();
                obiekt.choosePerson.add(addPerson);
                obiekt.choosePerson.addItem(nameWaiter);
                setVisible(false);
            }

        });
      
        addCancelButton = new JButton("Anuluj");
        addCancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                addPersonTextField.setText(null);
                setVisible(false);
            }
        });
        javax.swing.GroupLayout addPanelLayout = new javax.swing.GroupLayout(addPanel);
        addPanel.setLayout(addPanelLayout);
        addPanelLayout.setHorizontalGroup(
            addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(addPanelLayout.createSequentialGroup()
                .addGroup(addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(addPanelLayout.createSequentialGroup()
                        .addGap(126, 126, 126)
                        .addComponent(addPerson)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(addCancelButton))
                    .addGroup(addPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(addPersonLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(addPersonTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(34, Short.MAX_VALUE))
        );
        addPanelLayout.setVerticalGroup(
            addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addPanelLayout.createSequentialGroup()
                .addContainerGap(60, Short.MAX_VALUE)
                .addGroup(addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(addPersonLabel)
                    .addComponent(addPersonTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(29, 29, 29)
                .addGroup(addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(addPerson)
                    .addComponent(addCancelButton))
                .addGap(58, 58, 58))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(addPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(addPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        
        

        pack();
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setSize(450,200);
        setResizable(false);
        setLocationRelativeTo(null);
        
    }
    
    private JPanel addPanel;
    private JButton addCancelButton;
    private JButton addPerson;
    private JLabel addPersonLabel;
    private JTextField addPersonTextField;
    private String nameWaiter;
}
0

Nie analizowałem całości, przy dodawaniu kelnera błąd jest w pierwszym wierszu poniżej:

MainFrame obiekt = new MainFrame();
obiekt.choosePerson.add(addPerson);
obiekt.choosePerson.addItem(nameWaiter);
setVisible(false);

Ty tworzysz nowe okno (które nie jest wyświetlane), i w tym nowym oknie dodajesz kelnera.

0

na pewno jest źle? Pierwsza klasa jest od głównego okna, druga klasa wyświetla dodatkowe okno w którym podaje nazwę kelnera. setVisible(false) jest dlatego żeby po kliknięciu przycisku "Dodaj" JFrame ma zniknąć i zostaje tylko okno główne. Tą drugą linijkę zapomniałem usunąć. Miało być tak:

MainFrame obiekt = new MainFrame();
obiekt.choosePerson.addItem(nameWaiter);
setVisible(false);

Aby dodać element do JComboBox z klasy pierwszej (głównego okna) muszę utworzyć obiekt i potem w drugiej linijce chce dodać wartość nameWaiter do tego JComboBox i po tych operacjach okno znika. Przy działaniu żadne błędy mi nie wyskakują tylko jakby widok głównego okna się nie chce uaktualnić

0

Jak już się uwiniesz żeby odnieść się do poprzedniej porady to zostanie jeszcze bug z niezerowaniem zmiennej static int zmiennaPom = 0 która w tym wypadku wydaje się że powinna być zmienną lokalną. Oraz prawdopodobnie wywołanie metody powiadamiającej JTable że jej model został zmieniony, np. wywołując na obiekcie modelu metodę fireTableDataChanged()

0

Na pewno jest źle. W tym wierszu

MainFrame obiekt = new MainFrame();

tworzysz nowe okno typu MainFrame.
Masz zatem w programie dwa główne okna, pierwsze z nich utworzyłeś tu

public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                MainFrame mainFrame = new MainFrame();

W tym oknie musisz dodać nowego kelnera.

0

omg. Taki błąd... Już wszystko śmiga jak należy :) dzięki chłopaki

0

Definicja klasy NewPerson winna wyglądać tak:

class NewPerson extends JDialog {
    private MainFrame owner = null;
    public NewPerson(MainFrame owner){
        super(owner, "Dodaj nowego kelnera", true);
        this.owner = owner;
        ...
    NewPerson.this.owner.choosePerson.add(addPerson);
    NewPerson.this.owner.choosePerson.addItem(nameWaiter);
    setVisible(false);
    ...
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1