2013-03-04 3 views
0

Я новичок в Swing, и мой опыт работы с Java также ограничен. Я создаю графический интерфейс, но для того, чтобы перейти на главный экран, сначала требуется логин. Я структурированы мои классы, как это:Swing JPanel переключение из области

Корень дерева класса:

public class master { 

static mainwindow mainWindow; 
static login loginScreen; 

static JFrame frame;} 

Результат правильного имени пользователя и пароля необходимо переключить панель из loginscreen в MainWindow. Моя проблема в том, что когда в классе «login» выполняется действие входа в систему, я не могу получить доступ к моей основной панели или фрейму, потому что они находятся в классе, который «выше».

Я надеюсь, что я прошу ясно, если нет, я отредактирую свое сообщение с большим количеством кода и уточнения.

ответ

3

Вы не должны использовать статические переменные или методы так, как вы это делаете, чтобы дать методам и переменным глобальную область видимости, поскольку при этом вы теряете многие преимущества объектно-ориентированного программирования.

У вас должен быть основной класс, возможно, вы можете назвать его классом управления, который запускает все и передает ссылки на то, где это необходимо. Обычно мои окна входа - модальные диалоги, такие как JDialog, которые являются модальными к главному окну, который является JFrame.

Например, что-то вроде ...

public class MasterControl { 
    private MainView mainView = new MainView(this); 
    private LoginView loginView = new LoginView(this); 

    public MasterControl() { 
     loginAndStart(); 
    } 

    private void loginAndStart() { 
     JFrame frame = new JFrame("MasterControl"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainView.getMainPanel()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

     JDialog loginDialog = new JDialog(frame, "Log In", ModalityType.APPLICATION_MODAL); 
     loginDialog.getContentPane().add(loginView.getMainPanel()); 
     loginDialog.pack(); 
     loginDialog.setLocationRelativeTo(frame); 
     loginDialog.setVisible(true); 

     // here extract info from loginView, ask model to validate login credentials 
     // and then change main view. 
    } 
+1

Вы никогда не было необходимости для статических данных? Когда-либо? Конечно, использование OP статичным, скорее всего, неверно, но я комментирую ваш empahasis в комментарии «Nothing ... period». – splungebob

+0

@splungebob: Я на 99,9% уверен, что OP не должен использовать статику так, как он делает, что он, вероятно, использует ее, чтобы позволить возможность получать ссылки на объекты в «глобальной» области, что не является веской причиной его использования. Но вы, конечно, правы, что я был очень хреново в своем заявлении и что, вероятно, я должен перефразировать это. Если вы собираетесь использовать что-то статичное, вам лучше оправдать необходимость. –

+1

LOL - Я собирался сказать 99,99%, но зачем раскололи волосы? – splungebob

3

Одним из важных понятий в ОО является разделение ответственности.

В вашем случае не входит компонент Login, чтобы решить, какие действия следует предпринять после успешного входа в систему (вы также можете утверждать, что это неудачно).

В этом случае необходимо, чтобы компонент входа в систему сообщал заинтересованным сторонам о состоянии процесса входа в систему. Этого лучше всего достичь, используя что-то вроде шаблона наблюдателя.

В принципе, это означает, что у вас есть какой-то прослушиватель/обратный вызов, который может реагировать на изменения.

В следующем примере я использовал CardLayout как основное средство переключения видов, но вы могли бы так же легко использовать JDialog для формы входа (как это делали на воздушной подушке) и загрузить основной кадр после успешной обработки логина.

enter image description here

public class TestCardLogin { 

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

    public TestCardLogin() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel implements LoginListener { 

     private MainPane mainPane; 
     private LoginPane loginPane; 

     public TestPane() { 
      setLayout(new CardLayout()); 

      mainPane = new MainPane(); 
      loginPane = new LoginPane(this); 

      add(mainPane, "MAIN"); 
      add(loginPane, "LOGIN"); 

      ((CardLayout) getLayout()).show(this, "LOGIN"); 

     } 

     @Override 
     public void loginSuccessful() { 
      ((CardLayout) getLayout()).show(this, "MAIN"); 
     } 

     @Override 
     public void loginFailed() { 
      JOptionPane.showMessageDialog(TestPane.this, "Login failed", "Error", JOptionPane.ERROR_MESSAGE); 
     } 
    } 

    public class MainPane extends JPanel { 

     public MainPane() { 
      JLabel label = new JLabel("Welcome!"); 
      Font font = label.getFont(); 
      label.setFont(font.deriveFont(Font.BOLD, 32)); 
      setLayout(new GridBagLayout()); 
      add(label); 
     } 
    } 

    public class LoginPane extends JPanel { 

     private JTextField user; 
     private JPasswordField password; 
     private JButton login; 
     private LoginListener loginListener; 

     public LoginPane(LoginListener listener) { 
      this.loginListener = listener; 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.insets = new Insets(4, 4, 4, 4); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.anchor = GridBagConstraints.EAST; 
      add(new JLabel("User name:"), gbc); 
      gbc.gridy++; 
      add(new JLabel("Password:"), gbc); 

      gbc.gridx++; 
      gbc.gridy = 0; 
      gbc.anchor = GridBagConstraints.WEST; 

      user = new JTextField(12); 
      password = new JPasswordField(12); 

      add(user, gbc); 
      gbc.gridy++; 
      add(password, gbc); 

      login = new JButton("Login"); 

      gbc.gridx = 0; 
      gbc.gridy++; 
      gbc.anchor = GridBagConstraints.CENTER; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(login, gbc); 

      login.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        boolean accept = (boolean) (((int) Math.round(Math.random() * 1)) == 0 ? true : false); 
        if (accept) { 
         loginListener.loginSuccessful(); 
        } else { 
         loginListener.loginFailed(); 
        } 
       } 
      }); 

     } 
    } 

    public interface LoginListener { 

     public void loginSuccessful(); 

     public void loginFailed(); 
    } 
} 
Смежные вопросы