2016-12-09 3 views
1

Я пытался понять это сейчас, но не могу заставить его работать. По существу у меня есть JavaFX TextArea, и я хочу построить новый Object с именем CommandWrapper с последней строкой ввода (т. Е. Строка над кареткой после нажатия клавиши ENTER). Всякий раз, когда я ударил ENTER после ввода команды она работает безупречно, но по какой-то причине моей функции String.split() не получите пустую строку, если я не ВВЕД команды золы показана на рисунке GIF:JavaFX TextArea включает пустую строку с String.split()?

https://gyazo.com/49ebd82be02fc271eeb7a879b194c63c

Вот код относительно выпуска:

package com.mswordhf.jnet.java.contollers; 

import java.net.URL; 
import java.util.Arrays; 
import java.util.List; 
import java.util.ResourceBundle; 

import com.mswordhf.jnet.java.models.JnetModel; 
import com.mswordhf.jnet.java.modules.CommandWrapper; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TextArea; 
import javafx.scene.input.KeyCode; 

public class CmdController implements Initializable { 

private JnetModel model; 
private int clientIndex; 

@FXML private TextArea commandTextArea; 

public CmdController(JnetModel model, int clientIndex) { 
    this.model = model; 
    this.clientIndex = clientIndex; 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 

    commandTextArea.setOnKeyPressed(keyEvent -> { 

     if(keyEvent.getCode() == KeyCode.ENTER) { 

      List<String> lines = Arrays.asList(commandTextArea.getText().split("\\n")); 
      String command = lines.get(lines.size() - 1); 

      System.out.println(command); 

      if(command == "\n") { 
       System.out.println("Worked"); 
      }else { 
       CommandWrapper wrapper = new CommandWrapper(command); 
       model.getClients().get(clientIndex).getHandle().sendModule(wrapper); 

       if(!model.getCmdOutput.isRunning()) { 
        model.getCmdOutput.reset(); 
        model.getCmdOutput.start(); 
       } 
      } 

     } 

    }); 

    model.getCmdOutput.setOnSucceeded(event -> { 

     for(String line : model.getCmdOutput.getValue()) { 
      commandTextArea.appendText(line + "\n"); 
     } 

     model.clearList(); 

    }); 

} 

} 
+0

'==' проверяет примитив ('int',' char', 'double', ...), используйте' .equals (...) 'для проверки объекта (' String', 'Object ', ...). Также ['String # split'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split (java.lang.String)) не содержит регулярное выражение, которое Строка была разделена на результирующий массив. Это означает, что 'if (command.equals (" \\ n "))' всегда будет false, возможно, вы должны проверить пустую строку, 'if (command.equals (" "))'. –

+0

@JonnyHenly Спасибо за комментарий, и вы правы, я должен был использовать equals(), но проблема остается. Я считаю, что последняя пустая строка не подхвачена «String # split()», потому что «println (command)» всегда печатает строку 2 вверх от каретки после нажатия ENTER. –

ответ

1

Я очень неопределенными, почему, но с использованием:

commandTextArea.setOnKeyReleased(keyevent -> { 
    //code... 
} 

работает полностью, как предполагалось.

+0

Я озадачен тем, что освобождение ключа вместо его нажатия приведет к желаемому поведению, но если оно работает *, оно работает *. –

+0

О, возможно, нажатие клавиши нажато до того, как '\ n' добавлен в текст' commandTextArea'. Это единственная причина, о которой я могу думать. Хорошая работа, выясняя это, +1. –

+0

Да, это то, что я понял, должно быть так, спасибо, что помогли мне! –

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