Променлива за извикване от друг клас на Java

Имам този клас на екрана за влизане;

/*
 * 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                   
}

И имам друг клас;

/*
 * 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                   
}

Но имам проблем в cagbas.java, защото когато стартирам този клас, Java връща по-долу грешка;

проблем

Разбирам, че не мога да използвам нестатичен obj в основния метод. Но как мога да използвам първото въведено потребителско име и парола в моята програма?


person Lacrymae    schedule 30.01.2014    source източник
comment
Java е обектно ориентиран език за програмиране. Използвайте предмети.   -  person Sotirios Delimanolis    schedule 30.01.2014
comment
вместо това трябва да видите loginScreen.uname (след създаване на обект на екран за влизане).   -  person James Kingsbery    schedule 30.01.2014
comment
Моля, спазвайте конвенциите за именуване на Java. loginscreen трябва да бъде LoginScreen, а cagbas трябва да бъде Cagbas.   -  person The Guy with The Hat    schedule 30.01.2014
comment
@RyanCarlson, благодаря за напомнянето ми. Преработвам ги.   -  person Lacrymae    schedule 30.01.2014


Отговори (2)


Един проблем, който виждам, е, че вашият LoginScreen клас е JFrame и поведението на JFrame е да не спира програмния поток от извикващия код, когато се показва, така че дори ако можете да извлечете името за вход и паролата от този обект в по-късния си код , ще го извлечете твърде рано, преди потребителят да е имал време да въведе нещо.

Предложения:

  • Най-важното е, че се опитвате да стартирате код, който няма да се компилира. Никога не правете това, тъй като това гарантирано винаги ще се проваля. Вместо това поправете проблемите с компилацията, преди да опитате да стартирате програмата си.
  • Вашият LoginScreen трябва да бъде модален JDialog, а неJFrame.
  • Първо показвате този прозорец, за да получите информация от потребителя.
  • Ключовият момент тук е, че тъй като е модален JDialog, потокът на извикващия код спира, когато се покаже диалоговият прозорец.
  • След това кодът за повикване се възобновява, след като диалоговият прозорец бъде обработен и вече не се вижда, което означава, че след като потребителят или е въвел данни, или е отменил диалоговия прозорец.
  • По това време получавате името и паролата на потребителя за влизане (най-добре, ако последната е получена като char[]) от екземпляра на LoginScreen чрез извикване на методи за получаване и проверка, за да сте сигурни, че не са нулеви. т.е. LoginScreen трябва да има метод public String getUserName() и метод public char[] getPassword().
  • Кодът за повикване вече може да използва тази информация в базата данни.
  • И да, моля, научете конвенциите за именуване на Java и ги спазвайте, като имената на вашите класове започват с главни букви, а имената на методите и променливите с малки букви. Това ще улесни хората, които се опитват да разберат вашия код и ще ви помогне, а именно доброволците тук, да го направите по-добре.

Редактиране

Обърнете внимание също, че JOptionPane всъщност не е нищо повече от модален JDialog и това може да се използва и за вашите цели и също лесно. Например в примерния код по-долу създавам InputForm JPanel и след това поставям този JPanel в 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);
   }
}
person Hovercraft Full Of Eels    schedule 30.01.2014
comment
Разделът по-долу не е полезен? нов ProgramPenceresi().setVisible(true); изхвърлям(); Не знам как dispose работи дълбоко. - person Lacrymae; 30.01.2014
comment
Имам предвид; Loginscreen Jframe има dispose(); команда в jbutton кликна действие, ако потребителското име и паролата са верни. Е dispose(); спрете екрана за влизане и задайте видим основен прозорец на програмата? - person Lacrymae; 30.01.2014
comment
@Lacrymae: Мисля, че е по-добре, ако вашият LoginScreen не знае нищо за основната програма, че всичко, което знае, е, че трябва да получи въведеното от потребителя и нищо повече. Тогава същият този код за влизане може да се използва навсякъде другаде, където ви трябва. Ако е модален диалог, това ще работи, в противен случай няма. - person Hovercraft Full Of Eels; 30.01.2014
comment
Благодаря за предложенията. Мога внимателно да прочета публикацията ви и да опитам да обърна към Jdialog вместо Jframe. Но действителният ми проблем е как мога да използвам това нестатично потребителско име и парола в друг главен раздел на класа. - person Lacrymae; 30.01.2014
comment
@Lacrymae: Не, това е просто. Вие мислите, че това е проблемът, но всъщност лаете на грешното дърво и търсите решение на грешния проблем. Това е класически пример за XY проблем. - person Hovercraft Full Of Eels; 30.01.2014
comment
Ако можете да покажете модалния диалогов прозорец, тогава кодът, който го показва, може да направи запитване към диалога за низовете и проблемът е решен. Моля, погледнете моя примерен код по-горе, за да видите какво имам предвид. Освен това по-голямата част от този код в главния метод дори не трябва да е в основния метод. - person Hovercraft Full Of Eels; 30.01.2014
comment
@Lacrymae: Решавам вашия статичен/нестатичен проблем, като създавам екземпляр на моя InputForm и извличам низове и char[] от него чрез извикване на методи в него. Отново, моля, погледнете моя коментар по-горе и моя пример за код. - person Hovercraft Full Of Eels; 30.01.2014
comment
Проучвам кода по-горе. Благодаря ви много за вашите усилия. Вие показвате как променливите анализират друг клас според мен. Бихте ли обяснили как точно мога да внедря това решение в моя проект? Аз съм начинаещ в Java и използвам Netbeans Gui дизайнер. Трябва да използвам един екран за влизане и да контролирам входните параметри в базата данни. Ако параметрите са верни, трябва да ги запазя, за да ги използвам в главния метод на другия клас за изявление за sql връзка, както първо правя в Loginscreen. - person Lacrymae; 30.01.2014
comment
Мисля, че трябва да изучавам статични и нестатични променливи, за да разбера това фундаментално. Също и случаи. - person Lacrymae; 30.01.2014

Наистина ли целта ви е loginscreen да бъде глобален за всички екземпляри на вашите cagbas класове? Предполагам, че искате да дефинирате loginscreen logindetails като променливи на класа, но искате да ги инстанциирате по време на създаването/инициализирането на cagbas клас.

Нещо като това:

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();

Една стилова бележка, пишете имената на класовете си с главни букви.

[редактиране]
Не можете да получите достъп до uname в main, защото main е статичен, а uname не. Преместете това присвояване във функция СЛЕД като създадете своя клас Cagbas.
[/edit]

person KevinDTimm    schedule 30.01.2014
comment
Благодаря за предложението Кевин. Трябва да достигна до потребителско име и парола за Loginscreen всеки път, когато създавам нов клас и дефинирана sql връзка. - person Lacrymae; 30.01.2014
comment
Опитвам този метод, но String connectionUrl в Cagbas все още връща същата грешка. - person Lacrymae; 30.01.2014
comment
@ Lacrymae Може да искате да разгледате това stackoverflow.com/questions/18289930/ - person z atef; 30.01.2014