如何通过按JButton将单个字符添加到JTextField

时间:2013-05-25 01:43:58

标签: java swing jbutton jtextfield

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

的长度
    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 (上面随机选择的字)进行比较。每当它在中找到“A”,它必须在Jtextfield中将“A”绘制到特定位置,但它不是绘图......

            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());
        }

    }

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

...谢谢

1 个答案:

答案 0 :(得分:4)

问题在于使用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()

然后重新使用变量(按原样)......

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语句的第一级。

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

actionPerformed方法中,您只需要检查单词中A的所有匹配项并设置相应的文本字段

更新了工作示例...

尝试查找String中所有出现的字符的索引有很多技巧。

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

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

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

enter image description here

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);
    }
}