gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:16:39 24 4
gpt4 key购买 nike

我正在创建一个简单的程序,它允许我通过按 JButton 将单个字符添加到 JTextField。在这个程序中,我有一个名为 words 的字符串数组,我有一个名为 word 的字符串,它允许我从单词数组中随机选择单词。我正在使用 for 循环 来绘制 JTextFields。 JTextField 的数量取决于 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 中添加了一些方法,它将字符串 choiceword (上面随机选择的单词)进行比较。 无论何时它在 word 中找到“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());
}

}

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

谢谢....

最佳答案

问题是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);
}
}

关于java - 如何通过按 JButton 将单个字符添加到 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com