2

JButtonを押してJTextFieldに単一の文字を追加できる簡単なプログラムを作成しています。このプログラムには、wordsという名前の文字列の配列と、 word という名前の文字列があります。これにより、単語の配列からランダムに単語を選択できます。JTextFieldsを描画するために for ループを使用しています。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という名前の文字列があり、「Ä」という文字が 1 つだけ含まれています。そこで、文字列の選択単語 (上でランダムに選択された単語)と比較するメソッドを Jbutton に追加しました。単語に「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を確認してください。同じことをしたい...

ありがとう....

4

1 に答える 1

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

これはうまくいきません。 iequals 、つまり、ステートメント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));
    }
}

正規表現を使用して、特定のパターンのすべての出現箇所を見つけるという、少し複雑ですが柔軟なアプローチを使用します...

ここに画像の説明を入力

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);
    }
}
于 2013-05-25T02:15:22.653 に答える