2

I have this loginscreen class;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package program;
import java.sql.*;
import javax.swing.JOptionPane;

/**
 *
 * @author Lacrymae_Ev
 */
public class loginscreen extends javax.swing.JFrame {
    public String username;
    public String getUsername() {
       return username;
    }

    private String pwd;
    public String getPassword() {
       return pwd;
    }

    /**
     * Creates new form loginscreen
     */

    public loginscreen() {
        initComponents();
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        Uname_Textfield = new javax.swing.JTextField();
        Password_PasswordField = new javax.swing.JPasswordField();
        Buton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);

        Buton.setText("Bağlan");
        Buton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ButonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(Uname_Textfield, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(Password_PasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(54, 54, 54)
                        .addComponent(Buton)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addComponent(Uname_Textfield, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(Password_PasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(Buton, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

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


    private void ButonActionPerformed(java.awt.event.ActionEvent evt) {                                      
        // TODO add your handling code here:
       String username=Uname_Textfield.getText();
       String pwd= new String (Password_PasswordField.getPassword());
    try {  
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String connectionUrl = "jdbc:sqlserver://192.168.100.100;" + "databaseName=ExampleDB;" + "user=" + username + ";" + "password=" + pwd + ";"; 
        Connection con = DriverManager.getConnection(connectionUrl);
        new ProgramPenceresi().setVisible(true);
        dispose();
        }
    catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "Wrong username or passwordş!");   
        } 
    catch (ClassNotFoundException cE) {
            System.out.println("Class Not Found Exception: "+ cE.toString());
        }
    }                                     


    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(loginscreen.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(loginscreen.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(loginscreen.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(loginscreen.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new loginscreen().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton Buton;
    private javax.swing.JPasswordField Password_PasswordField;
    private javax.swing.JTextField Uname_Textfield;
    // End of variables declaration                   
}

And i have other class;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package program;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.JOptionPane;
import net.proteanit.sql.DbUtils;

/**
 *
 * @author Lacrymae_Ev
 */
public class cagbas extends javax.swing.JFrame {
    loginscreen logindetails = new loginscreen ();
    String uname = logindetails.getUsername();
    String pass = logindetails.getPassword();
    private static ResultSet rs;
    private static Statement stmt;
    private static Connection con;
    private static final String query = "select 'AICB',sum(dur) as dur,sum(tot)as tot from exampletable with(nolock)\n" +
"where date between '2013-07-01 00:00:00.000' and '2013-07-01 23:59:59.999'\n" +
"and id='013'";
    /**
     * Creates new form cagbas
     */
    public cagbas() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(DbUtils.resultSetToTableModel(rs));
        jScrollPane1.setViewportView(jTable1);

        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(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(15, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(14, Short.MAX_VALUE))
        );

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

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(cagbas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(cagbas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(cagbas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(cagbas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
 try
 {     
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String connectionUrl = "jdbc:sqlserver://192.168.100.100;" + "databaseName=ExampleDB;" + "user=" + uname + ";" + "password=" + pass + ";"; 
        Connection con = DriverManager.getConnection(connectionUrl);
        stmt = con.createStatement();
        rs = stmt.executeQuery(query);
 }
 catch(Exception ex)
 {    
    JOptionPane.showMessageDialog(null, ex.toString());
 } 
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new cagbas().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                   
}

But i have problem in cagbas.java because when i start this class java return below error;

problem

I understand i cant use non-static obj in main method. But how i can use first user entered true username and password in my program ?

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
Lacrymae
  • 157
  • 1
  • 17

2 Answers2

1

One problem I see is that your LoginScreen class is a JFrame, and a JFrame's behavior is to not stop program flow from the calling code when it is displayed, so even if you could extract the login name and password from this object in your later code, you'll be extracting it too early, before the user has had a time to enter anything.

Suggestions:

  • Most important is that you're trying to run code that won't compile. Never do this as this is guaranteed to always fail. Instead, fix compilation issues before trying to run your program.
  • Your LoginScreen should be a modal JDialog and not a JFrame.
  • You first display this window in order to get the user's input.
  • Key point here is, that because it is a modal JDialog, the calling code flow stops when the dialog is displayed.
  • The calling code then resumes once the dialog has been dealt with and is no longer visible, meaning once the user has either entered data or canceled the dialog.
  • At that time, you then get the login user's name and password (best if the latter is obtained as a char[]) from the LoginScreen instance by calling getter methods, and checking to be sure that they are not null. i.e., LoginScreen should have a public String getUserName() method and a public char[] getPassword() method.
  • The calling code can now use this information in the database.
  • And yeah, please learn Java naming conventions, and please comply with them by having your class names start with upper-case letters and method and variable names with lower-case letters. This will make it easier for folks trying to understand your code and help you, namely the volunteers here, do it better.

Edit

Note also that a JOptionPane is really nothing more than a modal JDialog, and this can be used for your purposes as well, and easily too. For example, in the example code below I create an InputForm JPanel and then place that JPanel into the JOptionPane:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class MainFoo extends JPanel {
   private static final int COLUMNS = 10;
   private JTextField userNameField = new JTextField(COLUMNS);
   private JTextField passwordField = new JTextField(COLUMNS);
   private InputForm inputForm = new InputForm();

   public MainFoo() {
      add(new JLabel("User Name:"));
      add(userNameField);
      add(Box.createHorizontalStrut(15));
      add(new JLabel("Password:"));
      add(passwordField);
      add(new JButton(new LogInAction("Log in", KeyEvent.VK_L)));
   }

   private class LogInAction extends AbstractAction {
      public LogInAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         int result = JOptionPane.showConfirmDialog(null, inputForm, "Input Form",
               JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
         if (result == JOptionPane.OK_OPTION) {
            userNameField.setText(inputForm.getUserName());


            // ***** never do this! ***** 
            // Never change a password into a String.
            // This is for demo purposes only.
            passwordField.setText(new String(inputForm.getPassword())); 
         }
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("MainFoo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new MainFoo());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}


@SuppressWarnings("serial")
class InputForm extends JPanel {
   private static final int COLUMNS = 10;
   private static final int GAP = 3;
   private static final Insets LABEL_INSETS = new Insets(GAP, GAP, GAP, 15);
   private static final Insets TEXTFIELD_INSETS = new Insets(GAP, GAP, GAP, GAP);
   private JTextField userNameField = new JTextField(COLUMNS);
   private JPasswordField passwordField = new JPasswordField(COLUMNS);

   public InputForm() {
      setLayout(new GridBagLayout());
      addLabel("User Name:", 0);
      addTextField(userNameField, 0);

      addLabel("Password:", 1);
      addTextField(passwordField, 1);

   }

   public String getUserName() {
      return userNameField.getText();
   }

   public char[] getPassword() {
      return passwordField.getPassword();
   }


   private void addTextField(JTextField field, int row) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.gridx = 1;
      gbc.gridy = row;
      gbc.anchor = GridBagConstraints.EAST;
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.insets = TEXTFIELD_INSETS;
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      add(field, gbc);
   }

   private void addLabel(String text, int row) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.gridx = 0;
      gbc.gridy = row;
      gbc.anchor = GridBagConstraints.WEST;
      gbc.fill = GridBagConstraints.BOTH;
      gbc.insets = LABEL_INSETS;
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      add(new JLabel(text), gbc);
   }
}
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • Below section not useful ? new ProgramPenceresi().setVisible(true); dispose(); I dont know how dispose works deeply. – Lacrymae Jan 30 '14 at 17:00
  • I mean; Loginscreen Jframe has dispose(); command in jbutton clicked action if username and password true. Is dispose(); stop the Loginscreen and set visible main program window ? – Lacrymae Jan 30 '14 at 17:02
  • @Lacrymae: I think it is better if your LoginScreen knows nothing about the main program, that all it knows about is that it is supposed to get the user's input and nothing more. Then this same login code can be used anywhere else you need it. If it is a modal dialog, this will work, else it won't. – Hovercraft Full Of Eels Jan 30 '14 at 17:06
  • Thanks for the suggestions. I can carefully read your post and try turn to Jdialog instead Jframe. But my actual problem is how can i use this non-static username ans password in another class main section. – Lacrymae Jan 30 '14 at 17:08
  • @Lacrymae: No that's just it. You **think** that that's the problem, but really you're barking up the wrong tree and looking at solving the wrong problem. This is a classic example of an [XY problem](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Hovercraft Full Of Eels Jan 30 '14 at 17:25
  • If you can display the modal dialog window, then the code that displays it can query the dialog for the Strings, and the problem is solved. Please look at my example code above to see what I mean. Also, most of that code in the main method shouldn't even be in the main method. – Hovercraft Full Of Eels Jan 30 '14 at 17:26
  • @Lacrymae: I solve your static/nonstatic problem by creating an instance of my InputForm, and getting Strings and char[]'s out of it by calling methods on it. Again, please have a look at my comment above and my code example. – Hovercraft Full Of Eels Jan 30 '14 at 17:51
  • I invetigate the code above. Thank you very much for your efforts. You show the how variables parse another class i think. Could you please explain how can implements this solution to my project exactly? I am beginner in Java ans use Netbeans Gui designer. I must use one login screen and control the input parameters in database. If parameters true i must keep them for using in anther class main method for sql connection statement like firstly doing in Loginscreen. – Lacrymae Jan 30 '14 at 18:22
  • I must study static and non-static variables i think for understand that fundamental. Also instances. – Lacrymae Jan 30 '14 at 18:40
0

Is it really your goal to have the loginscreen be global to all instances of your cagbas classes? I'm guessing you want to define loginscreen logindetails as class variables but you want to instantiate them during cagbas class creation/initialization.

Something like this:

public class cagbas extends javax.swing.JFrame {
    loginscreen logindetails;
    String uname;
    String pass;
    ....
    public cagbas () {
       initComponents();
       logindetails = new loginscreen ();
       uname = logindetails.getUsername();
       pass = logindetails.getPassword();

One style note, capitalize your classnames.

[edit]
You can't access uname in main because main is static and uname is not. Move that assignation into a function AFTER you instantiate your Cagbas class.
[/edit]

KevinDTimm
  • 14,226
  • 3
  • 42
  • 60
  • Thanks for the suggestion Kevin. I must reach Loginscreen username and password everytime when i create new class and defined sql connection. – Lacrymae Jan 30 '14 at 16:32
  • I try this method but String connectionUrl in Cagbas still return same error. – Lacrymae Jan 30 '14 at 16:37
  • @ Lacrymae You may want to take a look at this http://stackoverflow.com/questions/18289930/why-am-i-getting-a-non-static-variable-and-static-context-error – z atef Jan 30 '14 at 16:48