如何通过按JButton将单个字符添加到JTextField [英] How can I add single character to the JTextField by pressing the JButton

查看:95
本文介绍了如何通过按JButton将单个字符添加到JTextField的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个简单的程序,它将允许我通过按 JButton JTextField 添加单个字符.在此程序中,我有一个名为 words &的字符串数组.我有一个字符串名称 word ,这使我可以从单词数组中随机选择单词.我正在使用 for循环绘制 JTextFields . JTextField的数量取决于 word

I am creating a simple program, which will allow me to add single character to JTextField by pressing JButton. In this program, I have an array of string named words & I have a String name word, which is allowing me to choose words randomly from the array of words. I am using a for loop to draw the JTextFields. Number of the JTextField depends on the length of the word

    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.text.*;
    import java.util.Random;

    public class secondTab extends JFrame 
         {
             JTabbedPane Pane = new JTabbedPane();

             JPanel second = new JPanel();

             JButton guess1 = new JButton();

             Random r = new Random();

             JTextField Text[] = new JTextField[10];

             JButton A = new JButton();

             String words[] = {"JAVA" , "FLOAT" , "MAIN" , "STATIC", "FINAL", "PRIVATE" , "CHAR", "BOOLEAN" ,  "CASE"}; // An array to put the words

             String word = words[r.nextInt(words.length)];

             int i;

    public static void main(String args[]) 
        {
            //construct frame
            new secondTab().show();
        }

    public secondTab() 
        {
            // code to build the form
            setTitle("Adding Character");

            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
            getContentPane().setLayout(new GridBagLayout());

            // position tabbed pane
            GridBagConstraints gridConstraints = new GridBagConstraints();
            gridConstraints.gridx = 1;
            gridConstraints.gridy = 1;
            Pane.setForeground(Color.YELLOW);
            Pane.setBackground(Color.MAGENTA);

            getContentPane().add(Pane, gridConstraints);
            getContentPane().setLayout(new GridBagLayout());



            second.setLayout(new GridBagLayout());

            guess1.setText("New Word");
            gridConstraints.gridx = 0;
            gridConstraints.gridy = 0;
            second.add(guess1, gridConstraints);

            for( i = 1; i <=word.length(); i++)
                {
                    Text[i] = new JTextField();
                    Text[i].setPreferredSize(new Dimension(80, 80));
                    gridConstraints.gridx = 0;
                    gridConstraints.gridy = 2;
                    second.add(Text[i]);
                }  




            A.setText("A");
            A.setPreferredSize(new Dimension(80, 80));
            gridConstraints.gridx = 0;
            gridConstraints.gridy = 2;
            A.setHorizontalAlignment(SwingConstants.CENTER);
            second.add(A, gridConstraints);

我有一个名为 A 的JButton,该JButton出现错误.我有一个名为 choice 的字符串,它仅包含一个字符Ä".因此,我在Jbutton中添加了一些方法,该方法将字符串 choice word (上面随机选择的单词)进行比较.如果在单词中找到"A",则必须将Jtextfield中的"A"绘制到特定位置,但不能绘制...

I have a JButton named A, this JButton is having some error. I have the string named choice, it contains only one character "Ä". So, I added some method in my Jbutton, Which compare the string choice to the word ( the word which is randomly selected above). Whenever it find "A" in the word, it must have to draw that "A" in the Jtextfield to the specific location but its not drawing...

            A.addActionListener(new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                        {               
                              String choice = "A";

                              if (i < word.length() & i < choice.length())
                                {
                                    if (word.charAt(i) == choice.charAt(i))
                                        {
                                           Text[i].setText(choice.charAt(i) + " ");
                                        }
                                }  
                        }
                });

            // Action Performed method for the JButton guess1
            guess1.addActionListener(new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                        {
                            dispose();
                            new secondTab().show();
                        }
                });


            Pane.addTab("Game ", second); 

            pack();
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((int) (0.5 * (screenSize.width - getWidth())), (int) (0.5 * 
                    (screenSize.height - getHeight())), getWidth(), getHeight());
        }

    }

请检查视频 http://www.youtube.com/watch?v=Tx5QsET9IWs 从0.41秒开始.我想做同样的事情...

Please check that video http://www.youtube.com/watch?v=Tx5QsET9IWs starting from 0.41 second . I wanna do the same thing...

谢谢....

推荐答案

问题是使用i变量

首先用于构造字段

for( i = 1; i <=word.length(); i++)
{
    Text[i] = new JTextField();
    Text[i].setPreferredSize(new Dimension(80, 80));
    gridConstraints.gridx = 0;
    gridConstraints.gridy = 2;
    second.add(Text[i]);
}  

这现在意味着i现在等于word.length()

This now means that i is now equal to word.length()

然后,您按原样重新使用变量...

You then re-use the variable (as is)...

public void actionPerformed(ActionEvent e) 
{               
    String choice = "A";

    if (i < word.length() & i < choice.length())
    {
        if (word.charAt(i) == choice.charAt(i))
        {
            Text[i].setText(choice.charAt(i) + " ");
        }
    }  
}

这将不起作用. i等于word.length(),这意味着它将永远不会进入if语句的第一级.

Which won't work. i equals word.length(), meaning it will never enter the first level of the if statement.

i设为本地,仅将其用于构建字段数组.

Make i local and use it only to build the field array.

actionPerformed方法中,您只需要检查单词中所有A的出现并设置适当的文本字段

In the actionPerformed method, you simply need to be checking all the occurrences of A within the word and set the appropriate text field

有很多技巧可以尝试找到String中所有出现的字符的索引.

There are a number of tricks for trying to find the index of all the occurrences of character in the String.

最简单的方法是简单地遍历String的长度并使用String#charAt并将其与您尝试匹配的值进行比较...

The simplest would be to simply loop through the length of the String and use String#charAt and compare that with the value you are trying to match...

for (int index = 0; index < word.length(); index++) {
    if (Character.toLowerCase(word.charAt(index)) == Character.toLowerCase(choice)) {
        Text[index].setText(Character.toString(choice));
    }
}

我使用一种稍微复杂但灵活的方法,即使用正则表达式查找给定模式的所有出现...

I use a slightly more complicated, but flexible approach, using regular expression to find all the occurrence of a given pattern...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
import static javax.swing.Action.NAME;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class WordGuess {

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

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

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

        });
    }

    public static class TestPane extends JPanel {

        public static final String WORDS[] = {"JAVA", "FLOAT", "MAIN", "STATIC", "FINAL", "PRIVATE", "CHAR", "BOOLEAN", "CASE"}; // An array to put the words
        private String word;
        private List<JTextField> fields;
        private JPanel pnlFields;

        public TestPane() {
            setLayout(new BorderLayout());
            pnlFields = new JPanel();
            add(pnlFields);

            JPanel buttons = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            for (int index = 0; index < 26; index++) {
                if (index % 13 == 0) {
                    gbc.gridx = 0;
                    gbc.gridy++;
                }
                gbc.gridx++;
                JButton btn = new JButton(new LetterAction(Character.toString((char) ('A' + index))));
                btn.setMargin(new Insets(0, 0, 0, 0));
                buttons.add(btn, gbc);
            }

            add(buttons, BorderLayout.NORTH);

            reset();
        }

        public void reset() {

            word = WORDS[(int) Math.round(Math.random() * (WORDS.length - 1))];
            pnlFields.removeAll();
            fields = new ArrayList<>(word.length());
            for (int index = 0; index < word.length(); index++) {
                JTextField field = new JTextField(3);
                field.setEditable(false);
                field.setHorizontalAlignment(JTextField.CENTER);
                pnlFields.add(field);
                fields.add(field);
            }

        }

        protected class LetterAction extends AbstractAction {

            public LetterAction(String value) {
                putValue(NAME, value);
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                String value = getValue(NAME).toString().toLowerCase();
                List<Integer[]> occurances = findAllIndicies(word.toLowerCase(), value);
                System.out.println(word + " has " + occurances.size() + " occurances of " + value);
                for (Integer[] index : occurances) {
                    fields.get(index[0]).setText(value.toUpperCase());
                }
            }
        }
    }

    public static List<Integer[]> findAllIndicies(String value, String regExp) {
        Pattern pattern = Pattern.compile(regExp);
        return findAllIndicies(value, pattern);
    }

    public static List<Integer[]> findAllIndicies(String value, Pattern pattern) {
        Matcher matcher = pattern.matcher(value);
        String match = null;
        List<Integer[]> lstMatches = new ArrayList<Integer[]>(5);
        while (matcher.find()) {
            int startIndex = matcher.start();
            int endIndex = matcher.end();
            lstMatches.add(new Integer[]{startIndex, endIndex});
        }

        return Collections.unmodifiableList(lstMatches);
    }
}

这篇关于如何通过按JButton将单个字符添加到JTextField的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆