2017-03-18 15 views
-1

jTextfield에 값을 입력하면 jButton을 사용하지 않고 자동으로 누를 수 있습니까? 나는 그것의 가능하면 잘 모릅니다 .. 잘 아픈 JTextField를 자동으로 텍스트 필드 초기화 후 모든 KeyListener를 추가 수신하고 데이터베이스jTextfield에 값을 입력하면 jButton을 사용하지 않고 자동으로 누를 수 있습니까?

+0

네, 가능을 시뮬레이션해야 키보드 버퍼에 키 스트로크를 주입하는 java.awt.Robot을 사용, 모두의 아이디어를 제시 그러나 솔루션의 세부 사항은 문제의 세부 사항과 코드에 따라 다릅니다.더 설명하고 더 많이 표시하십시오. [mcve] 코드가 더 바람직합니다. –

+0

또는 바코드 스캐너를 실행 한 후 데이터베이스에서 쿼리 검색을 자동으로 시작하고 아이템 정보를 표시 할 수 있습니까? 죄송합니다. 자바와 프로그래밍에 익숙하지 않습니다. – JoMS

+0

현재 우리에게 숨겨져있는 문제의 세부 사항을 알 수있는 것처럼 귀하의 코드가 어떻게 보이는지를 묻는 것입니다. ** 다시 ** 귀하의 질문을 편집하고, 당신이하고자하는 일에 대해 훨씬 더 자세하게 설명하고, 관련 코드를 보여주십시오. –

답변

-1

에 쿼리를 시작합니다 스캔 한 후 내 바코드 스캐너를 사용하여 값을 표시 할 수 :

textfield.addKeyListener(new KeyListener() { 

    @Override 
    public void keyTyped(KeyEvent e) { 
     System.out.println("typed: "+e.getKeyChar()); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     System.out.println("released: "+e.getKeyChar()); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println("pressed: "+e.getKeyChar()); 
    } 
}); 

+0

아니요, 텍스트 구성 요소 내부에서 KeyListener를 사용하지 마십시오. –

+0

이것은 텍스트 구성 요소의 본연의 기능을 엉망으로 만들 것이며 다른 많은 상위 솔루션을 사용할 수 있습니다. 그러나 OP는 우리에게 사용하기에 가장 적합한 것이 무엇인지 알려주지 못했습니다. –

1

이 가능 필요에 따라 수정이 자동으로하는 JButton를 사용하지 않고 누르면됩니다 JTextField를에 값을 입력 한 후?

텍스트 필드에 ActionListener을 추가 할 수 있습니다.

텍스트 필드에 포커스가 있고 Enter 키를 누르면 수신기가 호출됩니다.

2

답변은 "언론"의 정의에 따라 다릅니다. 바코드를 스캔 할 때 내 경험에 의하면, 기대는, 액션은 사용자가 별도의 작업을 수행 할 필요없이 수행 할 것이다 가정을 바탕으로

, 당신은 두 가지 기본 선택

고정 길이

이 당신이 바코드의 길이를 알고 (그리고 상수의) 경우

, 당신은 행동 그래서

public class BarCodeLengthDocumentListener implements DocumentListener { 

    private ActionListener actionListener; 
    private int barCodeLength; 

    public BarCodeLengthDocumentListener(int barCodeLength, ActionListener actionListener) { 
     this.actionListener = actionListener; 
     this.barCodeLength = barCodeLength; 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     doCheck(e); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     doCheck(e); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     doCheck(e); 
    } 

    protected void doCheck(DocumentEvent e) { 
     Document doc = e.getDocument(); 
     if (doc.getLength() >= barCodeLength) { 
      try { 
       String text = doc.getText(0, doc.getLength()); 
       ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text); 
       actionListener.actionPerformed(evt); 
      } catch (BadLocationException exp) { 
       exp.printStackTrace(); 
       ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null); 
       actionListener.actionPerformed(evt); 
      } 
     } 
    } 

} 

에게 길이에 도달하면 감지하고 트리거 할 DocumentFilter을 사용할 수, 기본적으로, 이것은 당신이 특급을 지정할 수 있습니다 반사 된 바코드의 길이가 도달 할 때, 당신이 길이를 모르는 (또는 변수) 경우

가, 또 다른 옵션 인 ActionEvent

지연된 작업을 통해 텍스트를 전달 ActionListener을 트리거합니다 문서 이벤트가 발생하고 ActionListener

public class DelayedDocumentListener implements DocumentListener { 

    private ActionListener actionListener; 
    private String text; 
    private Timer timer; 

    public DelayedDocumentListener(ActionListener actionListener) { 
     this.actionListener = actionListener; 
     timer = new Timer(1000, new ActionListener() { 
             @Override 
             public void actionPerformed(ActionEvent e) { 
              ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text); 
              actionListener.actionPerformed(evt); 
             } 
            }); 
     timer.setRepeats(false); 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     doCheck(e); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     doCheck(e); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     doCheck(e); 
    } 

    protected void doCheck(DocumentEvent e) { 
     try { 
      Document doc = e.getDocument(); 
      text = doc.getText(0, doc.getLength()); 
     } catch (BadLocationException ex) { 
      ex.printStackTrace(); 
     } 
     timer.restart(); 
    } 

} 

트리거 그래서이 문서 이벤트가 발생할 때 사이의 (1 초의 경우) 지연을 생성하는 스윙 Timer를 사용하는 경우 사이에 지연의 어떤 주입을 트리거 할 때, 각 새 문서 이벤트는 Timer을 인터럽트하여 다시 시작합니다. 즉, 마지막 문서 이벤트와 ActionListener의 트리거링 사이에 최소한 1 초가 있어야합니다.

때때로 사람들은 수동으로 바코드를 입력해야하기 때문에 지연으로 게임을하고 싶을 수도 있습니다.

의 Runnable 예 ...

그래서, 이것은 기본적으로, 그것은 대부분의 바코드 스캐너

import java.awt.AWTException; 
import java.awt.EventQueue; 
import java.awt.Robot; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Document; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      BarCodeLengthDocumentListener lengthListener = new BarCodeLengthDocumentListener(7, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        String text = e.getActionCommand(); 
        JOptionPane.showMessageDialog(TestPane.this, text); 
       } 
      }); 
      DelayedDocumentListener delayedListener = new DelayedDocumentListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        String text = e.getActionCommand(); 
        JOptionPane.showMessageDialog(TestPane.this, text); 
       } 
      }); 

      JTextField field1 = new JTextField(7); 
      field1.getDocument().addDocumentListener(lengthListener); 
      JTextField field2 = new JTextField(7); 
      field2.getDocument().addDocumentListener(delayedListener); 

      add(field1); 
      add(field2); 

      JButton simLength = new JButton("Simulate Length"); 
      simLength.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        field1.setText(null); 
        field1.requestFocusInWindow(); 
        Thread t = new Thread(new Simulator()); 
        t.start(); 
       } 
      }); 
      JButton simDelay = new JButton("Simulate Delay"); 
      simDelay.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        field2.setText(null); 
        field2.requestFocusInWindow(); 
        Thread t = new Thread(new Simulator()); 
        t.start(); 
       } 
      }); 

      add(simLength); 
      add(simDelay); 
     } 

    } 

    public class Simulator implements Runnable { 

     @Override 
     public void run() { 
      try { 
       Robot bot = new Robot(); 
       type(KeyEvent.VK_1, bot); 
       type(KeyEvent.VK_2, bot); 
       type(KeyEvent.VK_3, bot); 
       type(KeyEvent.VK_4, bot); 
       type(KeyEvent.VK_5, bot); 
       type(KeyEvent.VK_6, bot); 
       type(KeyEvent.VK_7, bot); 
      } catch (AWTException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     protected void type(int keyStoke, Robot bot) { 
      bot.keyPress(keyStoke); 
      bot.keyRelease(keyStoke); 
     } 

    } 

    public class BarCodeLengthDocumentListener implements DocumentListener { 

     private ActionListener actionListener; 
     private int barCodeLength; 

     public BarCodeLengthDocumentListener(int barCodeLength, ActionListener actionListener) { 
      this.actionListener = actionListener; 
      this.barCodeLength = barCodeLength; 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      doCheck(e); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      doCheck(e); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      doCheck(e); 
     } 

     protected void doCheck(DocumentEvent e) { 
      Document doc = e.getDocument(); 
      if (doc.getLength() >= barCodeLength) { 
       try { 
        String text = doc.getText(0, doc.getLength()); 
        ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text); 
        actionListener.actionPerformed(evt); 
       } catch (BadLocationException exp) { 
        exp.printStackTrace(); 
        ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null); 
        actionListener.actionPerformed(evt); 
       } 
      } 
     } 

    } 

    public class DelayedDocumentListener implements DocumentListener { 

     private ActionListener actionListener; 
     private String text; 
     private Timer timer; 

     public DelayedDocumentListener(ActionListener actionListener) { 
      this.actionListener = actionListener; 
      timer = new Timer(1000, new ActionListener() { 
              @Override 
              public void actionPerformed(ActionEvent e) { 
               ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text); 
               actionListener.actionPerformed(evt); 
              } 
             }); 
      timer.setRepeats(false); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      doCheck(e); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      doCheck(e); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      doCheck(e); 
     } 

     protected void doCheck(DocumentEvent e) { 
      try { 
       Document doc = e.getDocument(); 
       text = doc.getText(0, doc.getLength()); 
      } catch (BadLocationException ex) { 
       ex.printStackTrace(); 
      } 
      timer.restart(); 
     } 

    } 
}