Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Передача соединения с БД


Автор: Listad 4.5.2006, 19:22
Сдравствуйте!! Я недавно начал изучать Java. Мне в ВШП дали задание с БД. Мне нужно создать соединение с БД (MySQL) и дальше продолжить работу с БД. Соединение надо создавать в отдельном окошке Connect, которое вызывается из меню. Соединение в Connect я создаю, а вот передать его в основной класс не могу. Почему-то блок в основном окне реализуется раньше чем происходит соединение
Цитата

 menu.add(connect);
           connect.addActionListener(new ActionListener(){

               public void actionPerformed(ActionEvent e) {
                   try {
                       if (con != null && !con.isClosed()) con.close();
                   } catch (SQLException e1) {
                       e1.printStackTrace();  
                   }
                   Connect obj = new Connect();
                   try{
      ошибка        // con = obj.getConnection();
                       System.out.println("return connection!");
                   } catch(Exception e1){
                       JOptionPane.showMessageDialog(null, e1.toString(), "Error", JOptionPane.ERROR_MESSAGE );

                   }

               }
           });

с помощью System.out.println("return connection!") я отследил эту проблему! Когда я вызываю меню Connect при появлении окна реализуется этот блок, соответственно, само соединение когда устанавливается, не передаётся smile . Подскажите, что сделать, что бы этот блок выполнялся после того, как я проведу соединение в окошке Connect?  

Автор: batigoal 5.5.2006, 09:11
Я не понял вот эту фразу: 
Цитата(Listad @  4.5.2006,  20:22 Найти цитируемый пост)
Почему-то блок в основном окне реализуется раньше чем происходит соединение

Какой блок? 

Автор: Listad 5.5.2006, 11:00
Блок, который я закинул. Он выполняется раньше, чем я установлю соединение в окошке Connect и передам его. Получается, когда я нажимаю на меню вот эта часть кода тоже реализуется: 
Код

 try{
                       con = obj.getConnection();
                       System.out.println("return connection!");
                   } catch(Exception e1){
                       JOptionPane.showMessageDialog(null, e1.toString(), "Error", JOptionPane.ERROR_MESSAGE );

                   }

               }
 Connect, 
А мне надо чтобы она выполнялась после того, как выполнится код Connect.  

Автор: ShamanTrirukiy 5.5.2006, 11:20
Приведи весь код. По обрывкам понять сложно...
 

Автор: Listad 5.5.2006, 11:27
Основной класс:
Код

public class Query extends JFrame {
    public ResultSetTableModel tableModel;
    public JTextArea queryTextArea;
    public Connection con;
    public Statement statement;
    private String txt;
    private ResultSet rs;
    public Query(){
           JFrame query = new JFrame("Query");
           JMenuBar menuBar = new JMenuBar();
           query.setJMenuBar(menuBar);
           JMenu menu = new JMenu("Menu");
           menuBar.add(menu);
           JMenuItem connect = new JMenuItem("Connect");
           menu.add(connect);
           connect.addActionListener(new ActionListener(){

               public void actionPerformed(ActionEvent e) {
                   try {
                       if (con != null && !con.isClosed()) con.close();
                   } catch (SQLException e1) {
                       e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                   }
                   Connect obj = new Connect();
                   try{
                       con = obj.getConnection();
                       System.out.println("return connection!");
                   } catch(Exception e1){
                       JOptionPane.showMessageDialog(null, e1.toString(), "Error", JOptionPane.ERROR_MESSAGE );

                   }

               }
           });
           JMenuItem exit = new JMenuItem("Exit");
           menu.add(exit);
           exit.addActionListener(new ActionListener(){

                       public void actionPerformed(ActionEvent e) {
                           System.exit(0);
                       }
                   });


           try {
               queryTextArea = new JTextArea(7,100);
               txt = queryTextArea.getText();

               JScrollPane scrollPane = new JScrollPane(queryTextArea,ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
               JLabel queryLabel = new JLabel("Query");
               JButton but = new JButton("Run query");

               but.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e) {
                       try {
                           try {
                           statement = con.createStatement();
                           } catch(Exception e3){
                               JOptionPane.showMessageDialog(null, e3.toString(), "Statement error", JOptionPane.ERROR_MESSAGE );
                           }
                           rs = statement.executeQuery (txt);
                           tableModel.setResultSet(rs);

                       } catch (SQLException e1) {
                           JOptionPane.showMessageDialog(null, e1.toString(), "Error", JOptionPane.ERROR_MESSAGE );
                       }
                       try {
                           statement.close();
                       } catch (SQLException e2) {
                           e2.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                       }

                       /*try {
                           tableModel.setQuery (txt);
                       } catch (SQLException e1) {
                           JOptionPane.showMessageDialog(null, e1.toString(), "Database error", JOptionPane.ERROR_MESSAGE );
                       } */
                   }
               });
               Container cont = query.getContentPane();
               Box box = Box.createHorizontalBox();
               box.add(scrollPane);
               box.add(but);
               JPanel top = new JPanel();
               top.setLayout(new BorderLayout());
               top.add(box, BorderLayout.CENTER);
               top.add(queryLabel, BorderLayout.NORTH);
               JTable resultTable = new JTable();
               JPanel bottom = new JPanel();
               JLabel resultsLabel = new JLabel("Results");
               bottom.setLayout(new BorderLayout());
               bottom.add(resultTable, BorderLayout.CENTER);
               bottom.add(resultsLabel, BorderLayout.NORTH);
               JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
               cont.add(splitPane, BorderLayout.CENTER);
               splitPane.setTopComponent(top);
               splitPane.setBottomComponent(bottom);

               Toolkit kit =Toolkit.getDefaultToolkit();
           Dimension screenSize = kit.getScreenSize();
           int screenHeight = screenSize.height;
           int screenWidth = screenSize.width;
           query.setLocation(screenWidth/4,screenHeight/4);
           query.setSize(screenWidth/2,screenHeight/2);
           query.setVisible(true);

           } catch (Exception e) {
               JOptionPane.showInternalMessageDialog(null, e.toString(), "Database Error", JOptionPane.ERROR_MESSAGE);   //To change body of catch statement use File | Settings | File Templates.
           }




    }

    public static void main(String[] args) {

        Query obj = new Query();
        obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}



класс Connect:
Код

public class Connect extends JFrame {
    private Connection con ;
    public Connect(){
            super();

            final JFrame win = new JFrame("Connect");
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel pan = new JPanel(new GridLayout(4,2));
            pan.add(new Label("Connect url"));
            final JTextField txt1 = new JTextField();
            pan.add(txt1);
            pan.add(new Label("Username"));
            final JTextField txt2 = new JTextField();
            pan.add(txt2);
            pan.add(new Label("Password"));
            final JTextField txt3 = new JTextField();
            //txt3.setEchoChar('*');
            pan.add(txt3);
            JButton but1 = new JButton("OK");
            but1.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e) {

                     try {
                        String conurl = txt1.getText();
                        String user = txt2.getText();
                        String pas = txt3.getText();
                        Class.forName ("com.mysql.jdbc.Driver");
                        try{
                        con = DriverManager.getConnection(conurl,user,pas);
                         }catch (Exception f){
                            

                             f.printStackTrace();
                            /*  if (con!=null){
                                  JFrame error = new JFrame("Error");
                                  Container cont =error.getContentPane();
                                  JPanel pan = new JPanel();
                                  JLabel label = new JLabel("Success=))");
                                  pan.add(label);
                                  cont.add(pan, BorderLayout.CENTER);
                                  error.setSize(300,100);
                                  error.setLocation(512,384);
                                  error.setVisible(true);
                         }

                              if (con==null){
                                  JFrame error = new JFrame("Error");
                                  Container cont =error.getContentPane();
                                  JPanel pan = new JPanel();
                                  JLabel label = new JLabel("Not Success=((");
                                  pan.add(label);
                                  cont.add(pan, BorderLayout.CENTER);
                                  error.setSize(300,100);
                                  error.setLocation(512,384);
                                  error.setVisible(true);
                              }  */
                        }

                     } catch (Exception ei) {

                         ei.printStackTrace();

                     }
                    win.dispose();
                }

            });
            JButton but2 = new JButton("Cancel");
            but2.addActionListener(new ActionListener (){

                public void actionPerformed(ActionEvent e) {

                    System.exit(0);

                }
            });

            pan.add(but1);
            pan.add(but2);
            Container cont = win.getContentPane();
            cont.add (pan, BorderLayout.CENTER);
            win.setSize(400,150);
            Toolkit kit = Toolkit.getDefaultToolkit();
            Dimension screenSize = kit.getScreenSize();
            int screenHeight = screenSize.height;
            int screenWidth = screenSize.width;
            win.setLocation(screenWidth/4,screenHeight/4);
            win.setVisible(true);

        }
    public Connection getConnection(){
        return con;
    }    
}


 

Автор: batigoal 5.5.2006, 12:06
Собственно, у тебя тут вообще не создается соединение. Ты создаешь новое окно, и только:
Код

Connect obj = new Connect();

После этого программа не станет дожидаться, пока ты нажмешь там ОК. Она благополучно пойдет дальше, к твоему println'у. 

Автор: Listad 5.5.2006, 16:03
А как тогда сделать? Я что-то плохо врубаюсь.... smile 
 

Автор: batigoal 5.5.2006, 16:29
А это смотря что ты хочешь получить. Наверное, так:
1. При выборе пункта меню Connect отображается твоё окошко (модальное, т.е. главное окно блокируется).
2. При нажатии OK вызывается какой-нибудь метод setConnection в главном окне, при этом ему передаются параметры из окошка. 

Автор: Listad 5.5.2006, 16:35
Я ещё плохо разбираюсь, но похоже да smile

Добавлено @ 16:37 
Мне посоветовали сделать через JDialog, но я не могу разобраться с ним. smile  Поэтому решил спросить совета у вас...

Добавлено @ 16:38 
Как не меняя код на JDialog  реализовать задумку? 

Автор: Listad 5.5.2006, 20:42
А не могли бы вы по конкретнее написать, что сделать? Хотелось бы увидеть код, чтобы понять получше.... 

Автор: LSD 5.5.2006, 23:00
Используй JOptionPane:
Код
int result = JOptionPane.showOptionDialog( 
            parentFrame,
            loginPanel,
            "Ttitle",
            JOptionPane.DEFAULT_OPTION,
            JOptionPane.INFORMATION_MESSAGE,
            null,
            buttonsNames,
            defaultButtonName
        );
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)