2011-10-05 4 views
3

JTextField과 함께 JOptionPane을 표시하려고합니다. 여기에는 초기 포커스가 있고 Enter 키를 누르 자마자 입력 한 텍스트로 작업을 수행하려고합니다. 텍스트 필드.JOptionPane 요소 간의 대체 포커스

몇 가지 광범위한 검색을 수행 했으므로 저를 도울 수있는 정보를 찾지 못했습니다. 나는 내가 지금까지 관리 여기에서 언급합니다 :

이 내가 뭔가를 지금까지 잘 작동

Object[] options = {"Option1", 
"Option2"}; 

Object[] message = new Object[2]; 

message[0] = "Type in the number of the incident:"; 
JTextField incidentNumberTextField = new JTextField(); 
message[1] = incidentNumberTextField; 

int n = JOptionPane.showOptionDialog(frame, 
    message, 
    "Open incident", 
    JOptionPane.YES_NO_OPTION, 
    JOptionPane.QUESTION_MESSAGE, 
    null, 
    options, 
    message[1]); 
if (n == -1) { 
    return; 
} 

있어 것입니다. 대화 상자가 나타나면 텍스트 필드에 포커스가 있습니다. 그러나 텍스트를 입력하고 Enter 키를 누르면 자동으로 "Option1"단추가 트리거됩니다.

리스너를 사용해 보았지만 최종적이지 않은 데이터 (예 : 텍스트 필드)에 액세스 할 수없는 것으로 보입니다.

답변

4

기본적으로, 당신은

  • 처음에 구성 요소를 중심 :-) 서로 싸우고있는 몇 가지 문제가 해결받을 필요가 : 그것은 여러 개의 사용자 정의 구성 요소를 전달하기위한 createOptionDialog 방법을 사용하는 트릭의 약간의 메시지 필드와 초기 값을 "initialSelectionValue"로 설정합니다.
  • 사용자 정의 버튼 : 다시 옵션 매개 변수로 사용자 정의 텍스트 (또는 실제 버튼은 중요하지 않음)를 전달하는 트릭입니다. 사실, 그것은 사용자가 사용할 수있는 선택을위한 것입니다. 그 중 하나는 처음에 선택된 것입니다 (그러면 포커스를 얻습니다)
  • 텍스트 필드에 작업 첫 번째 버튼 (== 둘러싸는 루트 페인의 기본 버튼)는 마지막의 JTextField의 사용자 정의 서브 클래스에 의해 해결 될 수

는 BasicOptionPaneUI의이주는 InputDialog에 사용하는 것처럼, 그것이에 표시된 것 Enter 키를 먹고 여기에 현장 자체는 모두 허용하는 방식으로 서 end - 최초의 2 개가 해결 된 경우에만 optionPane 컨텍스트에 유용합니다. "메시지"라는 개념을 "옵션"의 개념과 혼합하면, 옵션 팬을 이 아니라, 루트 팬의 기본 버튼을 설정하는으로 혼동하게됩니다. 따라서 결국 첫 번째 트릭을 사용하지 말고 "옵션"개념을 고수하고 필드의 addNotify에서 전송 요청을 통해 포커스를 속입니다.

@Override 
    public void addNotify() { 
     super.addNotify(); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       requestFocus(); 
      } 
     });     
    } 

특정 키 스트로크를 먹지 않는 사용자 정의 JTextField. MultiplexingTextField 전화를 키 입력의 처리에 전달하도록 구성된 경우 것 : 통제 된 환경에서

public static class MultiplexingTextField extends JTextField { 
    private List<KeyStroke> strokes; 
    public MultiplexingTextField(int cols) { 
     super(cols); 
    } 

    /** 
    * Sets the KeyStrokes that will be additionally processed for 
    * ancestor bindings. 
    */ 
    public void addKeyStrokes(KeyStroke... keyStrokes) { 
     for (KeyStroke keyStroke : keyStrokes) { 
      getMultiplexingStrokes().add(keyStroke); 
     } 
    } 

    private List<KeyStroke> getMultiplexingStrokes() { 
     if (strokes == null) { 
      strokes = new ArrayList<KeyStroke>(); 
     } 
     return strokes; 
    } 

    @Override 
    protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, 
             int condition, boolean pressed) { 
     boolean processed = super.processKeyBinding(ks, e, condition, 
                pressed); 

     if (processed && condition != JComponent.WHEN_IN_FOCUSED_WINDOW 
       && getMultiplexingStrokes().contains(ks)) { 
      // Returning false will allow further processing 
      // of the bindings, eg our parent Containers will get a 
      // crack at them. 
      return false; 
     } 
     return processed; 
    } 
} 

사용 :

Action fieldAction = new AbstractAction("fieldAction") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("hello " + ((JTextComponent) e.getSource()).getText()); 
     } 
    }; 
    JTextField field = new JTextField("this is a normal field"); 
    MultiplexingTextField multiplexing = new MultiplexingTextField(20); 
    multiplexing.addKeyStrokes(KeyStroke.getKeyStroke("ENTER")); 
    field.setAction(fieldAction); 
    multiplexing.setAction(fieldAction); 
    Action action = new AbstractAction("default button action") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("hello - got default button"); 
     } 
    }; 
    JButton button = new JButton(action); 
    JPanel panel = new JPanel(); 
    panel.add(field); 
    panel.add(multiplexing); 
    panel.add(button); 
    // this is swingx testing support, simply replace with normal frame creation 
    JXFrame frame = wrapInFrame(panel, "multiplex"); 
    frame.getRootPane().setDefaultButton(button); 
+0

답장을 보내 주셔서 감사 많은! :) 나는 그것을 시도하고 다시 여기에 게시됩니다. 친절 하네, 펠리페. –

+0

훌륭한 강의 +1에 감사드립니다. – mKorbel