2012-01-05 3 views
2

먼저 질문을하고 신청서를 설명해 드리겠습니다.JOptionPane과 같은 JFrame 모달을 만들려면 어떻게해야합니까?

JFrameJOptionPanes처럼 동작하도록하려면 어떻게해야합니까? (tutorial didn't help) 즉,

[Show content >> return a value]. Aditionally 나는

[Show the frame >> Ask information >> Modify an object passed as parameter to the constructor >> return something]

은 이미 "확인"버튼을 내가 (콘솔에 표시) 원하는 답을 얻을 만들어 질 필요하지만, return 문을 넣어 어디에서 파악하지 못할

난 함수가 무엇인가와 같은

public static String getAnswer(Args, Answer) 

Args이 필드의 이름, 데이터, 최대 아이폰에의 유형을 포함 할 수되고 싶어하고,

Answer은 사용자가 정보를 제공하고 "ok"를 클릭 한 후 수정할 개체입니다.

항상 및 인수와 대답이 있습니다. 예 : (스크린 샷을보고, 표시해야하는 "가장 복잡한"유형의 메시지, 데이터 유형에 따라 다른 종류의 구성 요소를 표시해야하기 때문에 불완전합니다.)

| Arg     | Answer  | 
-------------------------------------- 
| Type | fldName  |    | 
-------------------------------------- 
| int | Age:  | 22   | 
| String | Name:  | Roger  | 
| Date | Birth:  | 31/10/1989 | 

내가 지금까지 무슨 짓을 원하는 내용으로 (대화입니다) JFrame의를 표시하고 나에게 콘솔에서 답을 보여주기 위해 버튼을 만드는 것입니다.

어떻게 JFrame을 구축 할 수 있습니까? 나는 4 개의 클래스를 가지고 있으며, 그 중 3 개의 클래스는 스크린 샷 아래에 설명되어 있으며 마지막 세 개의 패널은 세 개의 다른 패널을 포함하는 JPanel을 빌드하고 JFrame에 추가합니다. 코드 click을보고 싶다면

JDialog를 사용하지 않는 이유는 부모 프레임이 필요하기 때문입니다. Java 응용 프로그램이 아닌 또 다른 응용 프로그램에서이를 표시해야하므로이 프레임은 이미 맨 위 프레임이어야합니다.



당신이 이것을 읽을 수 있지만 당신은 내가 뭘 읽기에 관심이 있다면, 가서하십시오 싶지 않을 수도 있습니다 :

임 알고, 그 JOptionPane.showMessageDialog()를 사용하여 등, 내 문제는 해결 될지 모르지만, 나는 그것이 내 필요에 맞도록 뜨겁게 파악할 수 없다. JOptionPane에 표시된 콘텐트는 나에게 제한된 것 같아요. 나는 콘트롤을 유지하는 법이나 내가 그 콘텐트에 넣는 아이들을 참조하는 법을 모릅니다. 모든 것이 행동을 바꿉니다.

다른 응용 프로그램에 값을 반환하는 다섯 가지 대화 상자를 만들어야합니다 (고통스러운 신탁 양식 6i). 대화 상자의 유형은 다음과 같습니다

  • 프린터 또는 옵션의 목록을 보여줍니다 인쇄 대화 상자는 "내보내기 파일에"메시지가 대화
  • 은 (전자 메일 미리보기와 같은) HTML 콘텐츠를 보여줍니다 "확인"버튼이 있습니다.
  • 예/아니요 대화 상자은 사용자에게 확인 메시지를 표시하며 메시지 대화 상자와 같은 방식으로 작동합니다.
  • 매개 변수 양식은 사용자에게 묻는 정보에 선택 또는 문자열 배열을 기반으로하는 몇 가지 정보를 제공하도록 요청합니다.
  • 값 목록은 select 문을 기반으로 plsql 개발자와 마찬가지로 결과를 보여줍니다. 여기

마지막 항목 (Parameter form)의 스크린 샷이다 예에서, 이비 항목은 달을 입력하며, 응답이 그 값으로 채워질 수있다. 각각의 메시지 대화 상자에서 사용자 입력 및 명령 단추 :

enter image description here

당신이 볼 수 있듯이

는 프레임 (I 3 개 클래스 TopPanel, MidPanelBotPanel로 만든) 3 개 블록으로 나누어 져 있습니다.

TopPanel는 JScrollPane의으로부터 연장하고 HTML 콘텐츠

MidPanel 표시 될 사촌 의해 JEditorPane를 생성 JScrollPane의으로부터 연장 (본리스트에서 마지막 두 다이얼로그 만 생성된다)에 기초하여 필드를 생성 폼에 전달되는 매개 변수로 전달되는 객체는 사용자에게 물어볼 수 있습니다.이 입력은 java, 즉 date, textField 또는 select 문을 기반으로하는 콤보 상자 일 수 있습니다 (그림에서 볼 수 있습니다. 데이터베이스에 대한 쿼리를 기반으로 한 12 개월).

BotPanel에는 매개 변수 목록 또는 예/아니오 대화 상자에 대한 응답과 같이 폼에서 제공 할 수있는 답에 대한 컨트롤이 있습니다. 이 패널은 모든 종류의 대화 상자로 변경됩니다. 예 : 예/아니오 대화 상자에는 "Yes"와 "No"버튼이있어 java를 만들거나 true 또는 false를 반환하지만 매개 변수 양식 대화 상자의 경우 ocurred 및 해당 정보가 포함 된 객체를 반환합니다. 사용자가 선택했다.

+3

'부모없는 JDialog' 가능 - (http://stackoverflow.com/questions/8606099/insert-jdialog-before-frameview-or-main-frame/ [이 SO 질문 참조] 8606222 # 8606222) –

+1

복잡한 GUI/JPanel을 JOptionPane에 두지 않는 이유는 무엇입니까? –

+0

@HovercraftFullOfEels 당신은 너무 복잡하다고 생각합니까? 모델을 변경해야합니까? 'mainPanel {Top {message}, Mid {changingContent}, Bot {changinContent}}와 같은 간단한 것을 볼 수있는 간단한 해결책이 있습니까? 저는 경험 많은 프로그래머가 아닙니다. 고맙습니다. – Roger

답변

5

다시 말해, 복잡한 GUI를 JOptionPane에 넣을 수 있습니다. JOptionPane show 메소드의 두 번째 매개 변수는 Swing 구성 요소가 될 수있는 Object를 취합니다. 예를 들면 :는

import java.awt.*; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.*; 

import com.roots.map.MapPanel.ControlPanel; 

public class ComplexDialog extends JPanel { 
    public static final String[] COMBO_LABELS = { "Nombre 1", 
     "Identificacion 1", "Fecha 1", "Empresa 1", "Nombre 2", 
     "Identificacion 2", "Fecha 2", "Empresa 2", "Nombre 3", 
     "Identificacion 3", "Fecha 3", "Empresa 3", "Nombre 4", 
     "Identificacion 4", "Fecha 4", "Empresa 4", "Nombre 5", 
     "Identificacion 5", "Fecha 5", "Empresa 5", "Nombre 6", 
     "Identificacion 6", "Fecha 6", "Empresa 6", "Nombre 7", 
     "Identificacion 7", "Fecha 7", "Empresa 7" }; 
    public static final String[] COMBO_ITEMS = { "January", "February", "March", 
     "April", "May", "June", "July", "August", "September", "October", 
     "November", "December" }; 
    private JTextArea textarea = new JTextArea(15, 30); 
    private Map<String, JComboBox> comboMap = new HashMap<String, JComboBox>(); 

    public ComplexDialog() { 
     textarea.setLineWrap(true); 
     textarea.setWrapStyleWord(true); 
     for (int i = 0; i < 100; i++) { 
     textarea.append("This is a really large text. "); 
     } 

     JPanel comboPanel = new JPanel(new GridBagLayout()); 
     for (int i = 0; i < COMBO_LABELS.length; i++) { 
     addToComboPanel(comboPanel, COMBO_LABELS[i], i); 
     } 

     int eb = 5; 
     setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb)); 
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(new JScrollPane(textarea)); 
     add(Box.createVerticalStrut(5)); 
     JScrollPane comboPanelScroll = new JScrollPane(comboPanel); 
     add(comboPanelScroll); 

     comboPanelScroll.getViewport().setPreferredSize(
      textarea.getPreferredSize()); 
    } 

    private void addToComboPanel(JPanel comboPanel, String labelText, int index) { 
     GridBagConstraints gbc = new GridBagConstraints(0, index, 1, 1, 0.2, 1.0, 
      GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 
        0, 5), 0, 0); 
     comboPanel.add(new JLabel(labelText, SwingConstants.RIGHT), gbc); 

     gbc = new GridBagConstraints(1, index, 1, 1, 1.0, 1.0, 
      GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(
        0, 0, 0, 0), 0, 0); 
     JComboBox combo = new JComboBox(COMBO_ITEMS); 
     comboMap.put(labelText, combo); 
     comboPanel.add(combo, gbc); 

    } 

    public String getComboChoice(String key) { 
     JComboBox combo = comboMap.get(key); 
     if (combo != null) { 
     return combo.getSelectedItem().toString(); 
     } else { 
     return ""; 
     } 
    } 

    public String getTextAreaText() { 
     return textarea.getText(); 
    } 

    public int showDialog() { 
     return JOptionPane.showOptionDialog(null, this, "Sirena", 
      JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, 
      new String[] { "Aceptar", "Cancelar" }, "Aceptar"); 
    } 

    private static void createAndShowGui() { 
     ComplexDialog dlg = new ComplexDialog(); 
     int response = dlg.showDialog(); 
     if (response == 0) { 
     System.out.println("JTextArea's text is:"); 
     System.err.println(dlg.getTextAreaText()); 

     System.out.println("Combo box selections are: "); 
     for (String comboLabel : COMBO_LABELS) { 

      System.out.printf("%20s: %s%n", comboLabel, dlg.getComboChoice(comboLabel)); 
     } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

안녕하세요,이 방법은 매우 쉽습니다. 고맙습니다! 이제 매개 변수 형식에서 문제가 발생했습니다. 필요한 필드가 있습니다. 어떻게 제어 할 수 있습니까? 필드가 채워지지 않으면 창이 닫히지 않습니다. 각 필드 종류에 대해 문서 수신기 나 서식있는 텍스트 필드를 만들어야한다는 것을 알고 있지만 "Ok"버튼으로 어떻게 처리 할 수 ​​있을까요? (이전 입력을 분명하게 채우는) 정보를 다시 묻는 창을 다시 만들 수 있습니다. 거기에 데이터베이스에 쿼리를 기반으로 구축 된 필드가, 그것은 재밌지 않을 질의. 이 문제에 대한 새로운 질문을해야합니까? – Roger

+0

남자!, 당신의 속도 !!, 당신은 그 시간에 프로그램을 만들었다! 다시 한 번 감사드립니다. D – Roger

+0

언제 다시 연결할지 모릅니다. 그래서 새로운 질문을 던졌습니다. http://stackoverflow.com/q/8762004/435394 – Roger

관련 문제