2013-07-09 3 views
0

Я новичок в Java и пытаюсь создать графический интерфейс, который действует точно так же, как в командном окне MatLAB.Введите конкретную строку в консоль вместо целого JTextArea

Я пытаюсь получить строку, которая в настоящее время вводится в JTextArea, отправленную на консоль, а не весь JTextArea. В моей нынешней стратегии используется каретщик и клавишник. На данный момент я использую ответ «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 вне дома? Кроме того, не хотите ли вы разделить текстовую область на две части? Один для вывода, один для ввода пользователем? – 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

Для вашей другой проблемы:

Вашего состояния if (evt.getKeyCode() == KeyEvent.VK_ENTER) конца перед тем myTextArea.append("\n" + ">>>" + " " + "matlab's response"); поэтому при нажатии клавиши, 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, добавьте содержимое JTextField в свой JTextArea. – TroyAndAbed

+0

Мне нужно, чтобы это был один JTextArea - я начал с этого, но он не соответствует требованиям моего текущего проекта. Хорошая идея! –

Смежные вопросы