2013-03-05 2 views
0

JOptionPane 여기처럼에 "내장"구성 요소로 사용할 수 있습니다임베드 된 JOptionPane 이벤트 수신 대기 중?

JOptionPane pane = new JOptionPane(message, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION); 
log.debug("Options are: ", pane.getOptions()); 
JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setLayout(new BorderLayout()); 
frame.add(chartPanel, BorderLayout.CENTER); 
frame.add(pane, BorderLayout.SOUTH); 
frame.pack(); 
frame.setSize(800, 800); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 

어떻게 사용자가 어떤 버튼을 클릭 할 때 반응, 옵션 창 버튼에 리스너를 부착 할 수 있습니까?

+2

자바 문서 : _ "JOptionPane을 사용하면 사용자에게 값을 묻거나"_을 (를) 알리는 표준 대화 상자를 쉽게 열 수 있습니다. JOptionPane는 표준 JFrame에 포함되지 않습니다. Btw,'frame.pack(); frame.setSize (800, 800); '는 모순입니다. 'pack()'또는'setSize()'(보통'pack()')를 호출하십시오. –

답변

0

pane.showConfirmDialog()을 사용하여 이벤트를 잡을 수 있습니다. 상황에 따라 JOptionPane.YES 또는 JOptionPane.CANCEL 중 하나가 반환됩니다.
JOptionPane은 팝업 대화 상자 용이므로 JFrame에 포함시키지 않으므로 기존 JPanel을 만들어야한다고 생각합니다.
CAN을 사용할 수 있다고하더라도, 당신이 뭔가를해야한다는 것을 의미하지는 않습니다.

0

원하는 사항입니다.

JOptionPane pane = new JOptionPane("Stackoverflow", JOptionPane.QUESTION_MESSAGE, 
     JOptionPane.YES_NO_OPTION); 

    JPanel buttonArea = (JPanel) pane.getComponents()[1]; 

    JButton b1 = (JButton)buttonArea.getComponent(0); 
    JButton b2 = (JButton)buttonArea.getComponent(1); 

    b1.removeActionListener(b1.getActionListeners()[0]); 

    b1.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Stackoverflow"); 
     } 
    }); 

    JFrame frame = new JFrame(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setLayout(new BorderLayout()); 
    frame.add(pane, BorderLayout.SOUTH); 

    frame.pack(); 
    frame.setSize(800, 800); 

    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
2

JOptionPaneJFrame에 포함되는 것이 아니라 대화 상자에 표시하기위한 것입니다 의미하지 않는다. 반복적으로 JOptionPane 구성 요소 계층 구조 JButton을 찾아 ActionListener를 추가 할 수

  1. 스캔 :

    지금, 나는 당신이 원하는 것을 달성하기 위해 3 가지 방법을 참조하십시오. 이 솔루션의 단점은 어떤 버튼이 어떤지 식별해야한다는 것입니다 (구성 요소 순서는 L & F에 따라 달라질 수 있음).

  2. JOptionPane.setValue(Object object)은 버튼을 클릭 할 때 호출됩니다.

  3. UPDATE는 단순히 JOptionPane.VALUE_PROPERTY에 변화를 수신 대기 PropertyChangeListener 추가 할 수 있습니다. 버튼이 눌릴 때마다 알림을 받게됩니다.

옵션 3이 가장 적합하고 최소 코드로 보입니다.

다음은이 두 번째 해결 방법입니다. 익명 클래스를 내부 클래스 또는 자체 파일로 확장하여 더 쉽게 액세스 할 수 있도록하십시오.

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.SwingUtilities; 

public class TestOptionPane { 

    protected void initUI() { 
     final JFrame frame = new JFrame(); 
     JOptionPane pane = new JOptionPane("Some message", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION) { 
      @Override 
      public void setValue(Object newValue) { 
       super.setValue(newValue); 
       JOptionPane.showMessageDialog(frame.getContentPane(), "You have hit " + newValue); 
      } 
     }; 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     frame.add(new JLabel("Some panel in the middle") { 
      @Override 
      public java.awt.Dimension getPreferredSize() { 
       return new Dimension(800, 500); 
      }; 
     }, BorderLayout.CENTER); 
     frame.add(pane, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestOptionPane().initUI(); 
      } 
     }); 
    } 
} 
+0

public 인'JOptionPane'의 생성자를 사용하는 방법은 무엇입니까? –

+0

@ SuzanCioc 만약 당신이 어떻게 든 그들에 뭔가를 추가로하고 싶습니다. 절대로 그렇게하지 않아도되지만, 그렇지 않은 이유는 무엇입니까? 어쨌든 더 나은 해결책을 찾았습니다. 나는 그것으로 내 대답을 업데이트 할 것이다 –

+0

@SuzanCioc 나는 제 3의 훨씬 더 나은 해결책으로 나의 대답을 업데이트했고 실제로 public에 접근 할 수있는 한가지 이유를 제공한다. 'JOptionPane'의 생성자 –