2016-08-09 2 views
-1

Это может показаться довольно простой проблемой, но я не понимаю, почему мой код не работает, и я был бы очень признателен, если бы один из вас, прекрасные люди, быстро посмотрите, почему это так.Как изменить центральную панель JField Border Layout

Так что я пытаюсь создать графический интерфейс для проекта, и я решил пойти с макетом границы. Наверху находится JPanel с логотипом и названием, которое останется неизменным. слева - JPanel с несколькими кнопками, которые потенциально могут изменить цвет. Наконец, в центре происходит волшебство. До сих пор мне удалось создать экран входа в систему, который работает, и мне предоставляется доступ, однако когда он пытается забрать меня на главный экран, ничего не происходит. enter image description here enter image description here

Что должно произойти (в соответствии с логикой я прикладной) является то, что JPanel в центре должен стать пустым, однако, как вы можете сказать, что это не происходит. Логикой кода я создал два JPanels, один для входа и один для главного экрана. У меня есть глобальная переменная state, и если пароль правильный, то state становится 1 и код будет отозван. В коде есть оператор switch-case, в котором говорится, что если state равно 1, то не загружать в логин JPanel, а скорее на главный экран, однако, как вы можете сказать, это не работает.

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

public class Border implements ActionListener{ 
JFrame f = new JFrame(); 
JButton loginButton, homeButton, starButton, elementButton, userButton, aboutButton, creditsButton, addUserButton; 
JTextField usernameField, passwordField, addUsernameField, addPasswordField; 
JSpinner addStateField; 
int state; 
String username; 
Boolean success; 

Border(){ 
    JButton b2=new JButton("SOUTH");; 
    //JButton b3=new JButton("EAST");; 
    JButton b4=new JButton("WEST");; 
    JButton b5=new JButton("CENTER");; 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    f.add(topBar(),BorderLayout.NORTH); 
    JPanel panel = new JPanel(); 
    f.add(b2,BorderLayout.SOUTH); 

    //f.add(b3,BorderLayout.EAST); 

    f.add(menuBar(state),BorderLayout.WEST); 
    switch (state) { 
     case 0: 
      f.add(loginCentre(),BorderLayout.CENTER); 
      break; 
     case 1: 
      f.add(homeScreenCenter(),BorderLayout.CENTER); 
      break; 
     case 4: 
      f.add(addUserCenter(),BorderLayout.CENTER); 
      break; 
    } 

    f.setSize(1000,600); 
    f.setVisible(true); 
} 

public JPanel menuBar(int state){ 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
    String[] options = {"Home", "Check Star", "Add Element", "Add User","About", "Credits"}; 

    for (int i = 0; i < options.length; i++){ 
     JButton button = new JButton(options[i]); 
     if (i == state - 1 && state != 0){ 
      button.setBackground(Color.cyan); 
     } else { 
      button.setBackground(Color.LIGHT_GRAY); 
     } 
     button.setBorder(new BevelBorder(BevelBorder.RAISED)); 
     button.setHorizontalAlignment(SwingConstants.RIGHT); 
     switch(i){ 
      case 0: 
       homeButton = new JButton(); 
       homeButton = button; 
       homeButton.addActionListener(this); 
       break; 
      case 1: 
       starButton = new JButton(); 
       starButton = button; 
       starButton.addActionListener(this); 
       break; 
      case 2: 
       elementButton = new JButton(); 
       elementButton = button; 
       elementButton.addActionListener(this); 
       break; 
      case 3: 
       userButton = new JButton(); 
       userButton = button; 
       userButton.addActionListener(this); 
       break; 
      case 4: 
       aboutButton = new JButton(); 
       aboutButton = button; 
       aboutButton.addActionListener(this); 
       break; 
      case 5: 
       creditsButton = new JButton(); 
       creditsButton = button; 
       creditsButton.addActionListener(this); 
       break; 
     } 
    } 
    panel.add(homeButton); 
    panel.add(Box.createRigidArea(new Dimension(20,15))); 
    panel.add(starButton); 
    panel.add(Box.createRigidArea(new Dimension(20,15))); 
    panel.add(elementButton); 
    panel.add(Box.createRigidArea(new Dimension(20,15))); 
    panel.add(userButton); 
    panel.add(Box.createRigidArea(new Dimension(20,15))); 
    panel.add(aboutButton); 
    panel.add(Box.createRigidArea(new Dimension(20,15))); 
    panel.add(creditsButton); 
    panel.add(Box.createRigidArea(new Dimension(20,15))); 
    panel.setBackground(Color.white); 
    return panel; 
} 
public JPanel topBar(){ 
    ImageIcon icon = new ImageIcon(getClass().getResource("Resources\\logo.jpg")); 

    JPanel panel = new JPanel(); 

    JLabel title = new JLabel("Star Explorer"); 
    title.setHorizontalAlignment(SwingConstants.CENTER); 
    title.setFont(new Font("Castellar",Font.PLAIN, 18)); 
    panel.add(title); 

    panel.add(Box.createRigidArea(new Dimension(500,0))); 

    JLabel label = new JLabel(""); 
    label.setIcon(icon); 
    label.setHorizontalAlignment(SwingConstants.RIGHT); 

    panel.add(label); 
    return panel; 
} 
public JPanel loginCentre(){ 
    JLabel name = new JLabel("Username:"); 
    usernameField = new JTextField("username"); 
    JLabel pass = new JLabel("Password:"); 
    passwordField = new JTextField("password"); 
    loginButton = new JButton("login"); 
    JPanel screen = new JPanel(); 

    screen.setLayout(new BoxLayout(screen, BoxLayout.PAGE_AXIS)); 

    screen.setBorder(new TitledBorder("login")); 
    name.setAlignmentX(Component.RIGHT_ALIGNMENT); 
    usernameField.setAlignmentX(Component.CENTER_ALIGNMENT); 
    pass.setAlignmentX(Component.RIGHT_ALIGNMENT); 
    passwordField.setAlignmentX(Component.CENTER_ALIGNMENT); 
    loginButton.setAlignmentX(Component.LEFT_ALIGNMENT); 

    loginButton.addActionListener(this); 

    screen.add(name); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(usernameField); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(pass); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(passwordField); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(loginButton); 

    JPanel fin = new JPanel(); 
    fin.setSize(600, 400); 
    //fin.setLayout(new BoxLayout(screen, BoxLayout.PAGE_AXIS)); 
    fin.add(Box.createRigidArea(new Dimension(0,100))); 
    fin.add(screen); 

    return fin; 
} 
public JPanel addUserCenter(){ 
    JLabel name = new JLabel("Username:"); 
    addUsernameField = new JTextField("username"); 
    JLabel pass = new JLabel("Password:"); 
    addPasswordField = new JTextField("password"); 
    JLabel st = new JLabel("State:"); 
    SpinnerModel spinnerModel = new SpinnerNumberModel(0,0,1,1); 
    addStateField = new JSpinner(spinnerModel); 
    addUserButton = new JButton("login"); 
    JPanel screen = new JPanel(); 

    screen.setLayout(new BoxLayout(screen, BoxLayout.PAGE_AXIS)); 

    screen.setBorder(new TitledBorder("login")); 
    name.setAlignmentX(Component.RIGHT_ALIGNMENT); 
    addUsernameField.setAlignmentX(Component.CENTER_ALIGNMENT); 
    pass.setAlignmentX(Component.RIGHT_ALIGNMENT); 
    addPasswordField.setAlignmentX(Component.CENTER_ALIGNMENT); 
    addUserButton.setAlignmentX(Component.LEFT_ALIGNMENT); 

    addUserButton.addActionListener(this); 

    screen.add(name); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(addUsernameField); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(pass); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(addPasswordField);  
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(addStateField); 
    screen.add(Box.createRigidArea(new Dimension(0,10))); 
    screen.add(addUserButton); 

    JPanel fin = new JPanel(); 
    fin.setSize(600, 400); 
    //fin.setLayout(new BoxLayout(screen, BoxLayout.PAGE_AXIS)); 
    fin.add(Box.createRigidArea(new Dimension(0,100))); 
    fin.add(screen); 

    return fin; 
} 
public JPanel homeScreenCenter(){ 
    JPanel fin = new JPanel(); 
    fin.setSize(600, 400); 
    fin.add(Box.createRigidArea(new Dimension(0,100))); 
    return fin; 
} 

public void actionPerformed(ActionEvent e){ 
    LoginDetails login = new LoginDetails(); 
    if (e.getSource() == loginButton){ 
     System.out.println(usernameField.getText()); 
     if (usernameField.getText() == "" || passwordField.getText() == ""){ 
      return; 
     } else if (login.login(usernameField.getText(), passwordField.getText())){ 
      JOptionPane.showMessageDialog(null, "ACCESS GRANTED!"); 
      username = usernameField.getText(); 
      success = true; 
      state = 1; 
      f.setVisible(false); 
      Border.run(); 
     } else { 
      JOptionPane.showMessageDialog(null, "ACCESS DENIED!", "WRONG PASSWORD", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
    if (e.getSource() == userButton && success){ 
     if (login.addToFilePermission(username)){ 
      state = 4; 
      f.setVisible(false); 
      Border.run(); 
     } else { 
      JOptionPane.showMessageDialog(null, "ACCESS DENIED!", "INVALID PERMISSIONS", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
    if (e.getSource() == addUserButton && addUsernameField.getText() != "" && addPasswordField.getText() != ""){ 
     User u = new User(addUsernameField.getText(), addPasswordField.getText(),(int) addStateField.getValue()); 
     login.addToFile(u); 
    } 
} 


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

Спасибо! - Сэм

Что-то быстро добавить, кнопка только на левом, которая реализуется кнопка AddUser, и что не работает либо: enter image description here Так что, если кто-нибудь знает, почему это так, то это было бы очень оценили!

+0

Чтобы лучше помочь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). Это было бы более полезно, чем публикация 3 снимков экрана. –

+0

@AndrewThompson проблема в том, что я не уверен, где проблема на самом деле происходит в коде. –

+0

Это часть того, что создает SSCCE/MCVE, ** предназначено для выяснения **, как описано в документе SSCCE! Учитывая, что вы, очевидно, не читали его, голосование на основе «отсутствия исследований». Следуйте предложенным ссылкам и *** внимательно прочитайте содержание. *** –

ответ

2

бит кода, который выполняется, когда Логин пользователя принимается только сделает новый экземпляр Border кто есть state по умолчанию 0:

state = 1; 
f.setVisible(false); 
Border.run(); 

run():

public static void run() { 
    new Border(); 
} 

Так что вы действительно меняете stateJFrame, что вы делаете невидимым (если вы закончили использовать JFrame, вы, вероятно, захотите вызвать метод dispose()). Таким образом, вместо того, чтобы изменить состояние Border экземпляра, изготовленного из run()

Также на стороне отметить, что может быть стоит проверить на Card Layout для управления несколькими JPanel с.

+0

Спасибо! Я принял ваш совет, и я пошел с карточным макетом, и это сделало его намного проще!Извините за причинение вам неприятностей, спасибо! –

Смежные вопросы