如何通过按JButton将单个字符添加到JTextField [英] How can I add single character to the JTextField by pressing the JButton
问题描述
我正在创建一个简单的程序,它将允许我通过按 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屋!