2015-04-29 44 views
1

我是新来的GUI的东西,并遇到以下问题的麻烦。我有3个JTextFields,信用卡号码,到期日期和安全号码。我能够将信息输入到字段中。我还为每个按钮实现了焦点侦听器。如果我点击它,它说获得了焦点,如果我点击其他任何地方,它会失去焦点。在这些文本字段下,我有一个数字键盘(触摸屏/鼠标点击)来输入数字。如何才能专注于特定的文本字段,直到只有其他两个文本字段中的一个被点击?一旦我尝试点击输入数字,当前拥有焦点的文本字段将失去焦点。我不希望发生这种情况。我在网上搜索,无法找到特定于我的案例的东西。任何帮助或提示,将不胜感激。如何在单击输入数字按钮时专注于JTextField?

+0

'这是为什么发生?' - 我为您提供了工作代码。你的代码有什么不同?发布证明问题的[SSCCE](http://sscce.org/)。 – camickr

回答

5
myJButton.setFocusable(false); 

,或者一堆的allMyButtons集合持有的按钮:

for (JButton button: allMyButtons) { 
    button.setFocusable(false); 
} 

就是这样。

+0

啊。现在我可以在网上找到很多东西。我会试试看,稍后再回复。谢谢。 – Kumar

+0

得到它使用这个工作。谢谢。我将所有数字按钮设置为false,并根据所关注的内容将文本字段在true和false之间交替。 – Kumar

3

除了@Hovercrafts建议(+1)之外,您可能还想将TextAction扩展为将数字插入文本字段的逻辑。该TextAction,您可以访问到具有焦点的最后一个文本字段,以便插入代码变得非常通用:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.text.*; 

public class NumpadPanel extends JPanel 
{ 
    public NumpadPanel() 
    { 
     setLayout(new BorderLayout()); 

     JTextField textField1 = new JTextField(4); 
     JTextField textField2 = new JTextField(2); 
     JTextField textField3 = new JTextField(2); 

     JPanel panel = new JPanel(); 
     panel.add(textField1); 
     panel.add(textField2); 
     panel.add(textField3); 
     add(panel, BorderLayout.PAGE_START); 

     Action numberAction = new TextAction("") 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       JTextComponent textComponent = getFocusedComponent(); 

       if (textComponent != null) 
        textComponent.replaceSelection(e.getActionCommand()); 
      } 
     }; 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(0, 5)); 
     add(buttonPanel, BorderLayout.CENTER); 

     for (int i = 0; i < 10; i++) 
     { 
      String text = String.valueOf(i); 
      JButton button = new JButton(text); 
      button.addActionListener(numberAction); 
      button.setMargin(new Insets(20, 20, 20, 20)); 
      button.setFocusable(false); 
      buttonPanel.add(button); 
     } 

     // Optionally auto tab when text field is full 

     //SizeDocumentFilter sf = new SizeDocumentFilter(); 
     //sf.installFilter(textField1, textField2, textField3); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Numpad Panel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new NumpadPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

您可能还需要考虑使用Text Field Auto Tab所以焦点从文本字段中移动的文本字段变成文本字段充分。

+0

谢谢您的回复,但我无法扩展TextAction类,因为我已经扩展了一个不同的类。有太多的代码要处理我。但我最终得到它与Hovercrafts的答案。 – Kumar

+0

@哈罗德,是的,气垫船的答案解决你的问题。 TextAction提供更好的设计。 “我已经扩展了不同的课程,什么课程?我没有理由像我演示的那样创建一个简单的类。该课程独立于您可能已创建的任何课程。 – camickr

+0

我想时间才是原因。我们正在设计一个POS系统,我负责SQL /数据库的东西。 GUI团队有太多的工作要处理,所以我决定尝试和帮助。我迷路了,不知道从哪里开始。这是一个很好的学习经历。我们的项目已经完成,但我会尝试修改代码以扩展TextAction。 – Kumar

相关问题