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?
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
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;
}
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.
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ć
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()
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.
omg. Taki błąd... Już wszystko śmiga jak należy :) dzięki chłopaki
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);
...
}