2013-05-04 2 views
3

Я разрабатываю программное обеспечение с несколькими компонентами - каждый со своим собственным исполнителем действий. Например, у меня есть JPanel с карточным выводом, который содержит 10 карт - каждый из них - JPanel и цель.Как приостановить метод до нажатия кнопки?

С одной стороны, есть несколько кнопок, I.E. Вход, выход из системы, настройки и т. Д.

Когда я нажимаю «Вход», он переключается на карту, используя метод Login() для объекта «Вход JPanel», где я хочу, чтобы он дождался нажатия кнопки I.E. Логин, Новый пользователь или Отмена перед продолжением метода Login() и установки текущего пользователя.

Есть ли способ приостановки программы до тех пор, пока одна из кнопок не будет нажата, чтобы извлечь данные из нее? (Вроде как, как JOptionPane.showInputMessage (нуль, "INPUT STRING") ждет вас)

Мой код ниже: РАМА:

/** 
* Frame design 
*/ 


public class Frame extends JFrame{ 
JPanel LeftSide, UpperRightSide; 
EmployeeAdder employAdd; 
ArrayList<ServiceView> serviceViewers; 
ChartViewer viewChart; 
PayByView viewPayBy; 
SettingsViewer viewSettings; 
LoginViewer viewLogin; 
CategoryView viewCategory; 
ServiceAdder serviceAdd; 
Directory directory; 
Employee currentEmployee; 
ChargeViewer viewCharge; 
JButton Login, Logout, Settings; 
CardLayout LeftCard,RightCard; 
String currentCard,currentRightCard; 
ButtonListen listen; 
public static String CARDCAT = "Category View"; 
public static String CARDPAY = "Pay By"; 
public static String CARDCHART = "Chart View"; 
public static String CARDLOGIN = "Log-in View"; 
public static String CARDSERVICEADD = "Service Adder"; 

Frame(){ 
    listen = new ButtonListen(); 
    //-------Current Card-------------------- 
    currentCard = CARDCAT; 
    currentRightCard = "CHARGE"; 
    //-----First Find Directory Folder------- 
    startDirectory(); 
    //-----User Interface-------------------- 
    //-------Left Side----------------------- 
    LeftSide = new JPanel(); 
    LeftCard = new CardLayout(); 
     LeftSide.setLayout(LeftCard); 
     viewPayBy = new PayByView(); 
     viewLogin = new LoginViewer(); 
     viewChart = new ChartViewer(); 
     viewCategory = new CategoryView(); 
     employAdd = new EmployeeAdder(); 
     serviceAdd = new ServiceAdder(); 
     LeftSide.add(viewCategory,"CAT"); 
     LeftSide.add(viewChart, "CHA"); 
     LeftSide.add(viewLogin,"LOG"); 
     LeftSide.add(viewPayBy,"PAY"); 
     LeftSide.add(employAdd,"EMA"); 
     LeftSide.add(serviceAdd,"SEA"); 
     LeftCard.show(LeftSide, "CAT"); 
     viewCategory.setEnabled(false); 
     LeftSide.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK),currentCard)); 
     serviceViewers = new ArrayList<ServiceView>(); 

    //--------Right Side--------------------- 
    JPanel RightSide = new JPanel(); 
     RightSide.setLayout(new BorderLayout()); 
     UpperRightSide = new JPanel(); 
     RightCard = new CardLayout(); 
     UpperRightSide.setLayout(RightCard); 
      viewSettings = new SettingsViewer(); 
      viewCharge = new ChargeViewer(); 
      viewCharge.setEnabled(false); 
      UpperRightSide.add(viewCharge,"CHARGE"); 
      UpperRightSide.add(viewSettings,"SETTINGS"); 
      UpperRightSide.setPreferredSize(new Dimension(350,500)); 
     RightSide.add(UpperRightSide,BorderLayout.NORTH); 
     //--------Buttons at the bottom Panel--- 
     JPanel Buttons = new JPanel(); 
      Buttons.setLayout(new GridLayout(3,1)); 
      Login = new JButton("LOG-IN"); 
       Login.addActionListener(listen); 
      Logout = new JButton("LOG OUT"); 
       Logout.addActionListener(listen); 
      Settings = new JButton("Settings"); 
       Settings.addActionListener(listen); 
      Buttons.add(Login); 
      Buttons.add(Logout); 
      Buttons.add(Settings); 
      Buttons.setPreferredSize(new Dimension(350,150)); 
     RightSide.add(Buttons,BorderLayout.SOUTH); 
     RightSide.setSize(new Dimension(400,200)); 
    //------Other Stuff-------------------------- 

    //-----add Panels---------------------------- 
     setLayout(new BorderLayout()); 
     add(LeftSide,BorderLayout.WEST); 
     add(RightSide,BorderLayout.EAST); 
} 


private void Login(){ 
    LeftCard.show(LeftSide, "LOG"); 

    //----I WANT IT TO WAIT HERE FOR AN ACTION------- 
    int clicked = viewLogin.getClicked(); 
     if (clicked==LoginViewer.NEWUSER){ 
      NewUser(); 
     }else if (clicked==LoginViewer.LOGIN){ 
      if (viewLogin.checkPassword()){ 
       currentEmployee = directory.getEmployee(viewLogin.getSelectedName()); 
       viewCategory.setEnabled(true); 
       viewCharge.setEnabled(true); 
       viewCharge.refreshName(currentEmployee.getName()); 
       LeftCard.show(LeftSide, "CAT"); 
      } 
     }else if (clicked==LoginViewer.CANCEL){ 
      LeftCard.show(LeftSide, "CAT"); 
     } 


} 




public class ButtonListen implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (!viewLogin.isWaiting()){ 
     if (e.getSource()==Login){ 
      if (currentCard.equals(CARDLOGIN)){ 
       LeftCard.show(LeftSide,"CAT"); 
       currentCard = CARDCAT; 

      }else{ 
       Login(); 
       currentCard = CARDLOGIN; 
      } 
     }else{ 
      //Don't change the screen 
     } 
     } 

    } 

} 

} 

Мой код для LoginViewer:

public class LoginViewer extends JPanel{ 
JComboBox User; 
JPasswordField passField; 
JButton NewUser, Login, Cancel; 
Hashtable<String,String> namespass; //names and password 
private int clicked = -1; 
ButtonListen listen; 
public static int NEWUSER = 1; 
public static int LOGIN = 0; 
public static int CANCEL = 2; 
boolean waiting; 

LoginViewer(){ 
    waiting = false; 
    //--------------------------------------- 
    setPreferredSize(new Dimension(100,100)); 
    listen = new ButtonListen(); 
    namespass = new Hashtable<String,String>(); 
    //----------Panel Design------------------- 
    JPanel Center = new JPanel(); 
     Center.setLayout(new GridLayout(3,3)); 
    User = new JComboBox(); 
    passField = new JPasswordField(); 
    NewUser = new JButton("New User"); 
     NewUser.addActionListener(listen); 
    Login = new JButton("Login"); 
     Login.addActionListener(listen); 
    Cancel = new JButton("Cancel"); 
     Cancel.addActionListener(listen); 
    Center.add(new JLabel("Choose User")); 
    Center.add(User); 
    Center.add(new JLabel("")); 
    Center.add(new JLabel("Type Password")); 
    Center.add(passField); 
    Center.add(new JLabel("")); 
    Center.add(Login); 
    Center.add(NewUser); 
    Center.add(Cancel); 
    Center.setPreferredSize(new Dimension(300,300)); 
    Center.setMaximumSize(new Dimension(100,100)); 
    Center.setAlignmentX(CENTER_ALIGNMENT); 
    setAlignmentX(CENTER_ALIGNMENT); 
    setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); 
    add(Box.createHorizontalGlue()); 
    add(Center); 
    add(Box.createHorizontalGlue()); 
} 


public void uploadUserNames(Hashtable<String,String> names){ 
    namespass.clear(); 
    namespass.putAll(names); 
    User.removeAllItems(); 
    Enumeration<String> name = names.keys(); 
    while (name.hasMoreElements()){ 
     User.addItem(name.nextElement()); 
    } 
} 

public boolean checkPassword(){ 
    boolean value = false; 
    String key = User.getSelectedItem().toString(); 
    if (passField.getPassword().length==4){ 
     if (namespass.get(key).equals(String.valueOf(passField.getPassword()))){ 
      value = true; 
     } 
    } 
    return value; 
} 

public String getSelectedName(){ 
    return User.getSelectedItem().toString(); 
} 

public boolean isWaiting(){ 
    return waiting; 
} 

public int getClicked(){ 
    waiting = true; 
    return clicked; 
} 

public class ButtonListen implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     waiting = false; 
     if (e.getSource()==NewUser){ 
      clicked = 1; 
     }else if (e.getSource()==Login){ 
      clicked = 0; 
     }else if (e.getSource()==Cancel){ 
      clicked = 2; 
     } 

    } 

} 
} 

Или проще просто использовать actionlistener для прослушивания ВСЕХ кнопок объектов?

Есть много кнопок ...

Примечание: Некоторые из методов являются неполными или методы испытаний, пока я не знаю, как заставить его работать ...

ответ

0

путь рамки свинг работает, что вы уже «ожидаете», чтобы все произошло, и это происходит только после того, как пользователи запускают действие, соответствующее вашему слушателю.

Так что да, в основном вам остается только ждать нажатия кнопок.

ОДНАКО: Проектирование гибких графических интерфейсов означает, что вы не позволяете своему пользователю ждать 10 секунд на замороженном интерфейсе, пока вы не выполните 10000 вычислений и 10 миллионов операторов SELECT. Таким образом, в случае, если ваши слушатели действия (или какие-либо конкретные слушатели, которых у вас есть), должны выполнять вычисления с высокой нагрузкой, делайте их на отдельном Thread и информируйте пользователя, если задача выполняется так или иначе.

2

Вы не хотите использовать линейный код консольного типа в графическом интерфейсе Swing. Вместо этого, с помощью управляемых событиями графических программ, вы захотите, чтобы пользовательские взаимодействия меняли состояние программы, а затем поведение программы зависело от состояния. Например, вместо того, чтобы приостановить метод входа в систему, выполните некоторую домашнюю работу - измените состояние программы, чтобы она была готова принять попытку входа в систему, а затем, когда вы планируете «ждать», выйдите из метода входа. Затем остальная часть кода для входа в систему находится в ActionListener кнопки входа в систему.

В качестве ссылки вы разместили лот кода, 95% из которого не имеет отношения к вашей проблеме и, таким образом, служит лишь отвлекающим фактором для нас и не позволяет нам читать код и понимать специфику вашей проблемы , В будущем подумайте над созданием и отправкой sscce, где вы сконденсируете свой код на самый маленький бит, который все еще компилируется, не имеет дополнительного кода, который не имеет отношения к вашей проблеме, но все еще демонстрирует вашу проблему для нас.

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