2013-07-09 7 views
0

저는 Java를 처음 사용하고 MatLAB의 명령 창과 똑같은 역할을하는 GUI를 만들려고합니다.전체 JTextArea가 아닌 콘솔에 특정 행을 입력하십시오.

전체 JTextArea 대신 콘솔에 보내진 JTextArea에 현재 입력중인 줄을 표시하려고합니다. 나의 현재 전략은 caretlistener와 keylistener를 사용하고있다. 지금은 자리 표시 자 응답으로 "matlab의 응답"을 사용하고 있습니다.이 응답은 enter 키를 누를 때 줄 아래의 줄이어야합니다. 모든 도움이 아주 많이 감사합니다

public class MatlabGui extends JPanel implements KeyListener { 

    protected JTextArea myTextArea;; 

    public MatlabGui() { 
     super(new GridBagLayout()); 

     myTextArea = new JTextArea(50, 75); 
     myTextArea.setEditable(true); 
     JScrollPane myScrollPane = new JScrollPane(myTextArea); 

     GridBagConstraints myCons = new GridBagConstraints(); 
     myCons.gridwidth = GridBagConstraints.REMAINDER; 

     myCons.fill = GridBagConstraints.BOTH; 
     myCons.weightx = 1; 
     myCons.weighty = 1; 
     add(myScrollPane, myCons); 

     myTextArea.addKeyListener(this); 

    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("Matlab"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new MatlabGui()); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

@Override 
public void keyPressed(KeyEvent evt) { 
    // TODO Auto-generated method stub 
    if (evt.getKeyCode() == KeyEvent.VK_ENTER) { 
     try { 
      myTextArea.addCaretListener(CaretListener); 
      int caretpos = myTextArea.getCaretPosition(); 
      int start = 0; 
      int end = 0; 

      start = myTextArea.getLineStartOffset(caretpos); 
      end = myTextArea.getLineEndOffset(caretpos); 

      System.out.println(myTextArea.getText(start, end)); 

     } catch (BadLocationException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     myTextArea.append("\n" + ">>>" + " " + "matlab's response"); 
       } 

}  
    public String getString() { 
     return myTextArea.getText(); 
    } 


    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

} 

:

여기 내 코드입니다. 건배

다른 문제에 대한
+0

, 당신은 밖으로 수 std 의미? 또한 텍스트 영역을 2 개로 분리하지 않으시겠습니까? 하나는 출력용이고 다른 하나는 사용자 입력 용입니까? – thatidiotguy

+0

예. std out을 의미합니다. 나도 그렇게 생각해. 내 프로젝트의 요구 사항 때문에 두 가지를 분리하고 싶지는 않습니다. 두 가지를 구분하지 않는 MATLAB COMMMAND 창을 모방하려고합니다. –

+1

간단한 'JTextField'를 사용하지 않는 이유는 무엇입니까? 또한 KeyListerners는 Swing의 낮은 레벨입니다. 사용하기에 좋은 아이디어는 아닙니다 :-) –

답변

0

내가 그것을 알아 냈 : 당신이 콘솔을 말할 때

@Override 
public void keyPressed(KeyEvent evt) { 
    // TODO Auto-generated method stub 
    if (evt.getKeyCode() == KeyEvent.VK_ENTER) { 
     try { 
      int end = myTextArea.getCaretPosition(); 
      int row = myTextArea.getLineOfOffset(end); 
      int column = end - myTextArea.getLineStartOffset(row); 
      int begin = end - column; 
      int length = end - begin; 

      System.out.println(myTextArea.getText(begin, length)); 

     } catch (BadLocationException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     myTextArea.append("\n" + ">>>" + " " + "matlab's response"); 
    } 

} 
0

:

당신의 상태 키를 누를 때 너무 myTextArea.append("\n" + ">>>" + " " + "matlab's response"); 전에 if (evt.getKeyCode() == KeyEvent.VK_ENTER) 끝은, myTestArea.append는 항상라고합니다.

당신은 수행해야합니다

if (evt.getKeyCode() == KeyEvent.VK_ENTER) { 
     try { 
      // Hint 
      // offset=myTextArea.getLineOfOffset(myTextArea.getCaretPosition()); 
      int start = 0; 
      int end = 0; 
      start = myTextArea.getLineStartOffset(start); 
      end = myTextArea.getLineEndOffset(end); 

      System.out.println(myTextArea.getText(start, end)); 

     } catch (BadLocationException ex) { 
      System.out.println(ex.getMessage()); 
     } 

     String text = myTextArea.getText(); 
     System.out.println(text); 

     myTextArea.append("\n" + ">>>" + " " + "matlab's response"); 
    } 
+0

감사합니다. 그것은 그 문제를 해결했습니다. 이제 전체 텍스트 영역이 아닌 현재 JTextArea에 입력되는 현재 줄을 잡는 방법을 알아야합니다. –

+0

JTextField를 사용하여 명령을 입력하고 Enter 키를 누르면 JTextArea에 JTextField의 내용을 추가합니다. – TroyAndAbed

+0

JTextArea가 되려면 JTextArea가 필요합니다.하지만 시작은 현재 프로젝트의 요구 사항을 충족시키지 못합니다. 그래도 좋은 생각이야! –