【问题标题】:setText on JLabel doesn't work inside KeyPressed methodJLabel 上的 setText 在 KeyPressed 方法中不起作用
【发布时间】:2014-04-09 06:28:23
【问题描述】:

每当我尝试在 KeyPressed 方法中使用 setText 时,它都不起作用,尽管当我在同一个类中的不同方法 (initComponents) 中使用它时,它在那里工作。

如有必要,请随时询问任何其他代码!

这是不起作用的 KeyPressed 方法:

    @Override
public void keyTyped(KeyEvent e) {
    char typed = e.getKeyChar();

    if (Character.isLetter(typed) && r.getHuidigeKolom() < r.getAantalLetters()) {
        typed = Character.toUpperCase(typed);
        r.getLetters()[r.positie(r.getHuidigeRij(), r.getHuidigeKolom())].setText(typed + "");
        r.getLetters()[r.positie(r.getHuidigeRij(), r.getHuidigeKolom())].setBackground(Color.blue);

        if (r.getHuidigeKolom() == 0) {
            for (int i = 1; i < r.getAantalLetters(); i++) {
                r.getLetters()[r.positie(r.getHuidigeRij(), i)].setText(".");
                r.getLetters()[r.positie(r.getHuidigeRij(), i)].setBackground(Color.blue);
            }

            r.volgendeKolom(true);

            if (r.getHuidigeKolom() < r.getAantalLetters()) {
                r.getLetters()[r.positie(r.getHuidigeRij(), r.getHuidigeKolom())].setBackground(hoverKleur);
            }

            if (typed == 10 && r.getHuidigeKolom() >= r.getAantalLetters()) {   //typed 10 is ENTER
                this.controle();
            }

            if (typed == 8 && r.getHuidigeKolom() > 0) {    //typed 8 is BACKSPACE
                this.eentjeTerug();
            }
        }
    }
}

setText 方法确实在这个方法中起作用:

    private void initComponents(String woord) {
    this.setLayout(new GridLayout(r.getAantalPogingen(), r.getAantalLetters(), 2, 2));
    for (int i = 0; i < r.getAantalPogingen() * r.getAantalLetters(); i++) {
        r.getLetters()[i] = new Label();
        r.getLetters()[i].setBackground(Color.white);
        r.getLetters()[i].setForeground(Color.black);
        r.getLetters()[i].setAlignment(Label.CENTER);
        r.getLetters()[i].setFont(new Font("Groot", Font.BOLD, 48));
        this.add(r.getLetters()[i]);
    }

    for (int i = 0; i < 5; i++) {
        r.getLetters()[i].setText(woord.charAt(i) + "");
        r.getLetters()[i].setBackground(Color.blue);
    }

    r.setHuidigeKolom(0);
    r.setHuidigeRij(0);
}

非常感谢您提供的任何帮助。

【问题讨论】:

  • 什么是r?
  • 请问你的目标是什么,没有你的 SSCCE 或 MCVE 或 MCTRE 就没有任何切割器,简短,可运行,可在局部变量中使用硬编码值进行编译
  • 上面代码中的[r.positie(r.getHuidigeRij(), i)] 和下面代码中.setText() 旁边的[i] 是否具有相同的值?
  • “如有必要,请随时询问任何其他代码!” - 提供一个可运行的示例。见How to create a Minimal, Complete, Tested and Readable example
  • 这是一款名为 Lingo 的猜词游戏,你猜一个单词,你只有第一个字母显示在这里:puu.sh/7l4w5.jpg 现在每当我输入它时,它应该像这样填满板:@ 987654323@ r.getLetters()[numberHere] 是显示字母的框的位置,在这种情况下,它可以从 0-24 填充,因为它是 5x5 板。

标签: java swing user-interface keylistener settext


【解决方案1】:

如果没有MCTRE,要查明问题的确切原因会有点困难,但我猜测问题的根源在于您使用的是 Key Listeners 而不是 Key Bindings。

KeyListener 对关注的组件非常挑剔,这很可能是您遇到的问题。除非它被添加到的组件具有应用程序的焦点,否则它不会触发(因此与容器一起使用并不理想)。下面是一个如何使用Key Binding 的简单示例:

import java.awt.event.*;
import javax.swing.*;

public class KeyBindings extends Box{
    public KeyBindings(){
        super(BoxLayout.Y_AXIS);
        final JTextPane textArea = new JTextPane();
        textArea.insertComponent(new JLabel("Text"));
        add(textArea);

        Action action = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.setText("New Text");
            }};
         String keyStrokeAndKey = "control SPACE";
         KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeAndKey);
         textArea.getInputMap().put(keyStroke, keyStrokeAndKey);
         textArea.getActionMap().put(keyStrokeAndKey, action);
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new KeyBindings());
        frame.pack();
        frame.setVisible(true);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多