2013-06-08 2 views
2

저는 최근에 WindowBuilder for Java로 프로그래밍을 시작했고 해결할 수없는 매우 성가신 문제가 발생했습니다.WindowBuilder의 성가신 문제

문제는 YesOrNo 메서드가 완료되기 전에 (줄 131) 디버그 (System.out.println (answer);)가 실행되는 것입니다. 그래서 그것은 내 프로그램의 "앞서"실행됩니다.

내 코드 :

main.java

package me.fractional.main; 

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 
import javax.swing.JTextField; 

public class main { 

GUI go = new GUI(); 
Studio so = new Studio(); 

private JFrame frmFractionalc; 

static JLabel logo = new JLabel(""); 
static JButton InputNext = new JButton("Continue"); 
static JLabel OutputMainText = new JLabel(""); 
static JTextField InputText = new JTextField(); 
static JButton InputYes = new JButton("Yes"); 
static JButton InputNo = new JButton("No"); 

public static int counter = 1; 
public int answer = 2; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       main window = new main(); 
       window.frmFractionalc.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public main() { 
    initialize(); 
    intro(); 
} 

public void Tutorial() 
{ 
    System.out.println("Tutorial"); 
    OutputMainText.setVisible(true); 
    go.OutputMainText("Welcome to! Click Next Turn to Continue."); 
} 
public void MainMenu() 
{ 
    System.out.println("MainMenu"); 
} 

private void initialize() { 
    frmFractionalc = new JFrame(); 
    frmFractionalc.getContentPane().setBackground(new Color(176, 224, 230)); 
    frmFractionalc.setBackground(new Color(0, 128, 128)); 
    frmFractionalc.setTitle("Fractional © - GameDevStory"); 
    frmFractionalc.setBounds(100, 100, 500, 300); 
    frmFractionalc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frmFractionalc.getContentPane().setLayout(null); 

    logo.setHorizontalAlignment(SwingConstants.CENTER); 
    logo.setBounds(42, 44, 400, 150); 

    frmFractionalc.getContentPane().add(logo); 
    frmFractionalc.getContentPane().add(InputNext); 
    OutputMainText.setHorizontalAlignment(SwingConstants.CENTER); 
    OutputMainText.setBounds(10, 69, 464, 105); 

    frmFractionalc.getContentPane().add(OutputMainText); 
    frmFractionalc.getContentPane().add(InputText); 

    frmFractionalc.getContentPane().add(InputYes); 

    frmFractionalc.getContentPane().add(InputNo); 



} 

public void intro() 
{ 

    logo.setIcon(new ImageIcon(main.class.getResource("/me/fractional/main/logo.png"))); 
    InputNext.setForeground(new Color(0, 0, 0)); 
    InputNext.setBounds(200, 239, 89, 23); 

    InputNext.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      switch(counter) 
      { 
       case 1: 
        logo.setVisible(false); 
        go.OutputMainText("Welcome to GameDevStudio!"); 
        counter = 2; 
        break; 
       case 2: 
        go.OutputMainText("Enter a name for your game studio below [10 characters max!]"); 
        InputText.setBounds(162, 174, 154, 20); 
        InputText.setColumns(10); 
        InputText.setVisible(true); 
        counter = 3; 
        break; 
       case 3: 
        so.setName(InputText.getText()); 
        if(so.getName().length() < 1 || so.getName() == null) 
        { 
         go.OutputMainText("Invalid name!"); 
         InputText.setVisible(false); 
         counter = 2; 
        } 
        else 
        { 
         go.OutputMainText(so.getName() + ", that's a name I'd use!"); 
         InputText.setVisible(false); 
         counter = 4; 
        } 
        break; 
       case 4: 
        InputNext.setVisible(false); 
        go.OutputMainText("Would you like to run the tutorial?"); 

        answer = go.YesOrNo(1); 

        System.out.println(answer); 

        break; 
      } 
     } 
    }); 
} 

}

GUI.java

package me.fractional.main; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import me.fractional.main.main; 

public class GUI { 

static int returnvalue; 

public void OutputMainText(String text) 
{ 
    main.OutputMainText.setText(text); 
    main.OutputMainText.setVisible(true); 
} 
public int YesOrNo(final int option) 
{ 

    main.InputYes.setBounds(112, 239, 89, 23); 
    main.InputNo.setBounds(287, 239, 89, 23); 


    main.InputYes.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      returnvalue = 1; 
      main.InputYes.setVisible(false); 
      main.InputNo.setVisible(false); 

      if(option == 1) 
      { 
       main.OutputMainText.setText(""); 
      } 
     } 
    }); 

    main.InputNo.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      returnvalue = 0; 
      main.InputYes.setVisible(false); 
      main.InputNo.setVisible(false); 

      if(option == 1) 
      { 
       main.OutputMainText.setText(""); 
      } 
     } 
    }); 

    return returnvalue; 

} 

}

Studio.java

package me.fractional.main; 

public class Studio { 

String s_name; 

public String getName() 
{ 
    return s_name; 
} 
public void setName(String name) 
{ 
    s_name = name; 
} 
} 
+0

너무 많은 코드 년 수명 쉽게 할 것이다, 당신이 How to use layouts을 확인하는 것 같아서 자세한 내용

에 대한 How to use dialogs에서

PS-을 봐 내 눈이 .. 코드가 짧아지면 문제가있는 곳에 초점을 맞 춥니 다. – nachokk

+0

예 또는 아니오를 확인하는 방법은 동기식이므로 반환 값을 설정하면 초기화 된 값이 이미 반환되므로 미리 실행됩니다. 나는 이것에 대한 해결책을 모르고 그것을 지적했다. –

답변

1

스윙은 이벤트 중심 환경이므로 사용자가 원하는대로 순서대로 상호 작용할 수있는 사용자 입력을 프로그램하는 것을 의미합니다.

콘솔 프로그램과 같은 선형 입력 프로세스 대신 이벤트를 통한 사용자 상호 작용을 사용자에게 알립니다.

즉, 메쏘들은메쏘드가 호출되기 전에 반환됩니다.

어떤 이유로 응용 프로그램 흐름을 중지해야하는 경우, 어떤 종류의 대화 상자 만 사용하면됩니다. 당신이 거기있는 동안

그들이 긴 잘못된

+0

안녕하세요, 답장을 보내 주셔서 감사합니다.하지만 매우 진보적이지 않은 다른 창이 튀어 나오지 않고 만들 수있는 방법이 없습니까? 이 문제를 해결할 수있는 더 좋은 방법이 있습니까? –

+0

당신이 그것을 할 수있는 유일한 방법은 UI를 다른 패널들로 분리하는 것입니다. 첫 번째 패널은 질문을하고, 응답을 감지하고 패널을 전환해야합니다. – MadProgrammer

+0

아니요, 저는 꽤 사회적으로 부적합합니다 ... 저는 코더입니다 ... – MadProgrammer