2016-06-04 4 views
2
btnStraight = new JButton("Straight"); 
    btnStraight.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 

     /* Delay if statement until an ArrayList reaches a certain size */ 

      if(RouletteHelperMethods.doBet("Straight") == 1){ 
       textArea.setText("Congrats, you won!"); 
      } else { 
       textArea.setText("Sorry, you lost."); 
      } 
     } 
    }); 

사용자가 버튼을 클릭 한 다음 JTextFields를 클릭하여 ArrayList에 추가하라는 메시지가 표시됩니다. 이 문제가 발생할 때까지 if 문을 지연시키는 방법은 무엇입니까?메서드를 계속 진행하기 위해 값을 기다리는 방법?

+0

자세한 정보는 'ArrayList'에 추가하는 것이 무엇입니까? 우리가 어둠 속에서 길을 걷고있는 것처럼 느껴진다. 너는 우리에게서 너무 많은 정보를 빼앗고있다. –

+0

나는 나의 질문을 편집했다. JTextFields를 ArrayList에 추가했다. 사용자가 버튼을 클릭하면, JTextFields를 클릭하여 내기를 원하는 것에 추가하라는 지시를 받아야한다. JTextFields의 ArrayList가 특정 크기 (이 경우 1)에 도달하면 if 문을 실행하려고합니다. –

+0

좀 더 편집하십시오. 우리가 보여주지 않은 모든 코드를 볼 수없는 것처럼 물어보십시오. 또한 완전히 설명되지 않은 개념을 이해하지 못합니다. –

답변

2

리니어 콘솔 프로그램을 작성한 것처럼 이것을 코딩하고 있기 때문에 프로그램이 어떻게 돌아가는지 다시 생각해 봐야하지만, 그렇지는 않습니다. 대신 이벤트 기반의 GUI 프로그램 인을 코딩하므로 "대기"코드 대신 이벤트에 반응하고 상태를 변경해야합니다.

더 자세한 정보가 필요하면 프로그램에서 수행해야 할 작업, ArrayList의 의미, 링크가 아닌 링크에 유효한 내용 minimal example program (링크를 읽어주십시오).

나는 논리적 인 필요에 따라 놀려고 했었고, 많은 JTextField를 만드는 작은 프로그램을 만들었습니다. 클릭하면 보유한 텍스트가 JTextArea에 추가되고 필드가 선택된 필드 ArrayList에 추가됩니다. 목록에 추가 된 필드 수가 4이면 논리가 실행됩니다. 이것은 모든 텍스트 필드에 추가 된 FocusListener에서 호출됩니다. 예를 들면 다음과 같습니다.

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.*; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class EventDrivenGui extends JPanel { 
    private static final int FIELD_SIZE = 10; 
    private static final int SELECTED_FIELD_SIZE = 4; 
    protected static final Color SELECTED_COLOR = Color.PINK; 
    private JButton btnStraight; 
    private JTextArea textArea = new JTextArea(20, 40); 
    private List<JTextField> selectedFieldList = new ArrayList<>(); 
    private List<JTextField> fieldList = new ArrayList<>(); 

    public EventDrivenGui() { 
     btnStraight = new JButton("Straight"); 
     btnStraight.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (selectedFieldList.size() > 0) { 
        return; 
       } 
       for (JTextField textField : fieldList) { 
        textField.setEnabled(true); 
       } 
       JOptionPane.showMessageDialog(btnStraight, "Please Select a text field", 
         "Make Selection", JOptionPane.INFORMATION_MESSAGE); 

      } 
     }); 

     textArea.setFocusable(false); 

     JPanel fieldPanel = new JPanel(new GridLayout(0, 1, 5, 5)); 
     for (int i = 0; i < FIELD_SIZE; i++) { 
      JTextField field = new JTextField("Field " + (i + 1), 10); 
      field.setEnabled(false); // so they can't select it prematurely 
      fieldList.add(field); 
      fieldPanel.add(field); 

      field.addFocusListener(new FocusAdapter() { 
       @Override 
       public void focusGained(FocusEvent e) { 
        JTextField tf = (JTextField) e.getComponent(); 
        if (!selectedFieldList.contains(tf)) { 

         textArea.append(tf.getText() + "\n"); 
         tf.setBackground(SELECTED_COLOR); 
         selectedFieldList.add(tf); 
         if (selectedFieldList.size() >= SELECTED_FIELD_SIZE) { 
          if (RouletteHelperMethods.doBet("Straight") == 1) { 
           textArea.append("Congrats, you won!\n"); 
          } else { 
           textArea.append("Sorry, you lost.\n"); 
          } 

          reset(); 
         } 
        } 

       } 
      }); 

     } 

     add(btnStraight); 
     add(new JScrollPane(textArea)); 
     add(fieldPanel); 
    } 

    protected void reset() { 
     selectedFieldList.clear(); 
     for (JTextField jTextField : fieldList) { 
      jTextField.setEnabled(false); 
      jTextField.setBackground(null); 
     } 
    } 

    private static void createAndShowGui() { 
     EventDrivenGui mainPanel = new EventDrivenGui(); 

     JFrame frame = new JFrame("EventDrivenGui"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

class RouletteHelperMethods { 

    public static int doBet(String bet) { 
     return Math.random() > 0.5 ? 1 : 0; 
    } 

} 
+0

예제 코드를 사용해 주셔서 감사합니다. 다른 방법을 사용하는 것이 좋습니다. 불행히도, 나는 방금 고등학교 자바 수업을 마쳤고 FocusListener는 다루지 않았다. –

관련 문제