ASCII Непечатаемые символы в текстовом компоненте
Моя ситуация заключается в том, что мне нужно отсканировать qrcode в текстовом поле, которое я должен проанализировать, и которое содержит непечатные символы (кстати, это всегда один и тот же символ), который никогда не попадает в одну и ту же позицию.
Я пытаюсь получить этот код безуспешно
- Ошибка textfield.getText()
- Ошибка textfield.getDocument().getText(0,textfield.getDocument().getLength())
У меня есть успех, используя KeyBindings
и затем замените как комментарии @trashgod глифом.
Пример:
public class Test {
private JPanel panel;
private JTextArea textArea;
public static final String GS_UNICODE = "\u241D";
public Test(){
panel = new JPanel();
textArea = new JTextArea(10,30);
final JTextField textfield = new JTextField(30);
textfield.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_F8,0), "test");
textfield.getActionMap().put("test", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
textfield.setText(textfield.getText()+GS_UNICODE);
}
});
textfield.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
textArea.setText(textfield.getText());
}
});
panel.add(textfield);
JButton button = new JButton("Press non-readable");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
try {
Robot robot = new Robot();
textfield.requestFocusInWindow();
robot.setAutoDelay(10);
robot.keyPress(KeyEvent.VK_F8);
robot.keyPress(KeyEvent.VK_H);
robot.keyPress(KeyEvent.VK_E);
robot.keyPress(KeyEvent.VK_L);
robot.keyPress(KeyEvent.VK_L);
robot.keyPress(KeyEvent.VK_O);
robot.keyPress(KeyEvent.VK_ENTER);
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
//check if string has glyph
System.out.println(textfield.getText().contains(GS_UNICODE));
System.out.println(textfield.getText());
}
});
} catch (AWTException ex) {
ex.printStackTrace();
}
}
});
panel.add(button);
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("DataMatrix example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationByPlatform(Boolean.TRUE);
Test example =new Test();
frame.add(example.panel,BorderLayout.CENTER);
frame.add(example.textArea,BorderLayout.SOUTH);
//Display the window.
frame.pack();
frame.setVisible(Boolean.TRUE);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Но мои вопросы:
1) Есть ли способ захвата непечатаемых кодов ASCII (n<31 и n=127) через базовую модель текстового компонента (он же Document) вместо KeyBinding и без замены на глифоподобный textfield.setText(textfield.getText()+"myReplacement");
, Например, в модели с регулярным выражением "\ p {Cntrol}"
2) Предполагая, что KeyBinding является правильным способом, если мне нужно прослушать все непечатаемые символы, есть ли автоматический способ изменить этот код с его глифом?