2016-03-18 4 views
0

Вот мой код:Как я могу избавиться от «статического»?

public class Main extends JFrame{ 

static int NoOfUsers; 
static String[][] Accounts = new String[NoOfUsers][2]; 

public static void main(String[] args){ 
    Login(); 
} 

private static void Login() { 
    final String FileName = "F:/TextFiles/loginaccs.txt"; 
    try { 
     BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(FileName))); 
     int NoOfUsersL = Integer.parseInt(file.readLine()); 
     String[][] Accounts = new String[NoOfUsersL][2]; 
     NoOfUsers = NoOfUsersL; 
     for (int i=0; i<NoOfUsersL; i++) { 
      Accounts[i][0] = file.readLine(); 
      Accounts[i][1] = file.readLine(); 
     } 
     for (int i=0; i<NoOfUsersL; i++) { 
      System.out.println(Accounts[i][0]); 
      System.out.println(Accounts[i][1]); 
     } 
     file.close(); 

    } catch (IOException e) { 
     System.out.println("ERROR: unable to read file."); 
     e.printStackTrace(); 
    }  

    String username = null; 
    String password = null; 
    JTextField usernamejtf = new JTextField(username); 
    JPasswordField passwordjtf = new JPasswordField(password); 
    String[] buttons = {"Login", "Create new account"}; 
    Object[] InputDialog = { 
      "Username: ", usernamejtf, "Password: ", passwordjtf 
    }; 

    do { 

    int option = JOptionPane.showOptionDialog(null, 
      InputDialog, 
      "Login", 
      JOptionPane.DEFAULT_OPTION, 
      JOptionPane.PLAIN_MESSAGE, 
      null, 
      buttons, 
      buttons[0]); 
    System.out.println(option); //Check 

    if (option == JOptionPane.CLOSED_OPTION) { 
     return; 
    } 
    else if (option == 0) { 
     if (CheckAccount(username,password)) { 
      System.out.println("Logged in"); 
     } else { 
      System.out.println("Wrong Password/Username"); 
     } 
    } else if (option == 1) { 
     System.out.println("Create Account."); 
     } 

    } while (!(CheckAccount(username,password))); 
} 


private static boolean CheckAccount(String username, String password) { 
    for (int i=0; i>NoOfUsers; i++) { 
     if ((username == Accounts[i][0]) && (password == Accounts[i][1])) { 
      return true; 
     } 
    } 
    return false; 
} 

}

В «основной», я назвал метод Логин(), и Eclipse, заставляет меня поставить слово «статический» перед именем метода ,
В любом случае, я могу изменить программу так, чтобы ее можно было написать как: private void Login() {...}; private boolean CheckAccount (...) {...} и т. Д.?

[Дополнительный вопрос: Из-за слова «статический» я не могу поставить что-то вроде слова «public» перед String [] [] Учетные записи = новая строка [NoOfUsersL] [2];
С помощью CheckAccount доступ к массиву учетных записей невозможен. Как я могу изменить программу, чтобы исправить эту проблему.]
Thx каждый заранее.

+2

Вам необходимо создать экземпляр 'Main', чтобы использовать методы в качестве методов экземпляра. –

+0

Это заставляет вас использовать 'static', потому что нестатические методы принадлежат' instance', а не 'class'. Вам нужно создать экземпляр 'Main'. –

+0

Ответ на дополнительный вопрос: Да, вы можете. Статические переменные также известны как переменные класса. Локальные переменные не могут быть объявлены статическими. – thanga

ответ

0

сделать new Main().login();

Вы должны следовать соглашениям Java Naming, имена переменных и методов должны начинаться с буквы в нижнем регистре.

1

статические методы могут быть вызывать статические методы (без экземпляра), таким образом, чтобы вызвать метод экземпляра сначала создать его и вызвать от экземпляра, как exampled, как показано ниже

public static void main(String[] args){ 
    Main main = new Main();  
    main.login(); 
} 

private void login() { //remove static from instance methods 
+0

Wow не знал, что это было так просто, thx so much: D – DeeThreeCay

+0

Почему вы храните экземпляр Main в переменной? Yoh отходов памяти. –

+1

@ Bálint Память берется с 'new Main()'. удерживая его в переменной, не так важно, как вы указываете. Эта переменная является просто ссылкой на нее. –

0

Использование:

public static void main(String[] args){ 
    Main main = new Main(); 
    main.login(); 
} 
+0

Зачем вам нужно хранить экземпляр в переменной? Вы теряете память. –

+2

@ Bálint все равно будет храниться в памяти, потому что выполняется в стартовой нити –

0

В чтобы удалить статические классификаторы, вы должны сделать все свои методы и переменные экземпляров переменных и методов. Затем вы можете создать экземпляр объекта JFrame и позвонить login().

Я также преобразовал имена методов/переменных в mixedCase в соответствии с официальными соглашениями Java. Я полагаю, что вы начали программировать на VB или C#?

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Main extends JFrame { 
    private static final long serialVersionUID = -105943237549003486L; 

    private int numOfUsers; 
    private String[][] accounts; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Main m = new Main(); 

       m.login("F:/TextFiles/loginaccs.txt"); 
      } 
     }); 
    } 

    // Constructor, set up instance values here. 
    public Main() { 
     super(); 
    } 

    private void login(final String fileName) { 
     try { 
      BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); 

      numOfUsers = Integer.parseInt(file.readLine()); 
      accounts = new String[numOfUsers][2]; 

      for (int i = 0; i < numOfUsers; i++) { 
       accounts[i][0] = file.readLine(); 
       accounts[i][1] = file.readLine(); 
      } 

      for (int i = 0; i < numOfUsers; i++) { 
       System.out.println(accounts[i][0]); 
       System.out.println(accounts[i][1]); 
      } 

      file.close(); 

     } catch (IOException e) { 
      System.out.println("ERROR: unable to read file."); 
      e.printStackTrace(); 
     } 

     String username = null; 
     String password = null; 
     JTextField usernamejtf = new JTextField(username); 
     JPasswordField passwordjtf = new JPasswordField(password); 
     String[] buttons = { "Login", "Create new account" }; 
     Object[] InputDialog = { "Username: ", usernamejtf, "Password: ", passwordjtf }; 

     do { 
      int option = JOptionPane.showOptionDialog(null, InputDialog, "Login", JOptionPane.DEFAULT_OPTION, 
        JOptionPane.PLAIN_MESSAGE, null, buttons, buttons[0]); 
      System.out.println(option); // Check 

      if (option == JOptionPane.CLOSED_OPTION) { 
       return; 
      } else if (option == 0) { 
       if (checkAccount(username, password)) { 
        System.out.println("Logged in"); 
       } else { 
        System.out.println("Wrong Password/Username"); 
       } 
      } else if (option == 1) { 
       System.out.println("Create Account."); 
      } 

     } while (!(checkAccount(username, password))); 
    } 

    private boolean checkAccount(String username, String password) { 
     for (int i = 0; i > numOfUsers; i++) { 
      if (username == accounts[i][0] && password == accounts[i][1]) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 
Смежные вопросы