setText на JLabel не работает внутри метода KeyPressed

Всякий раз, когда я пытаюсь использовать setText внутри метода KeyPressed, он не работает, хотя, когда я использую его в другом методе (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);
}

Я очень ценю любую помощь, которую вы можете предоставить.


person WalidY    schedule 06.03.2014    source источник
comment
Что такое ‹code›r‹\code›?   -  person Andrew Koroluk    schedule 06.03.2014
comment
пожалуйста, в чем цель, без вашего SSCCE, MCVE или MCTRE ничего не получится, коротко, запускаемо, компилируемо с жестко запрограммированным значением в локальных переменных   -  person mKorbel    schedule 06.03.2014
comment
Имеют ли [r.positie(r.getHuidigeRij(), i)] в приведенном выше коде и [i] в ​​приведенном ниже коде рядом с .setText() одно и то же значение?   -  person dARKpRINCE    schedule 06.03.2014
comment
Не стесняйтесь спрашивать любой другой код, если это необходимо! — предоставьте исполняемый пример. См. раздел Как создать минимальный, полный, проверенный и удобочитаемый пример.   -  person Paul Samsotha    schedule 06.03.2014
comment
Это игра на угадывание слов под названием Lingo, в которой вы угадываете слово, и у вас есть только первая буква, показанная здесь: puu .sh/7l4w5.jpg Теперь всякий раз, когда я печатаю, он должен заполнять доску следующим образом: puu.sh /7l4Aw.png r.getLetters()[numberHere] — это место в поле, где отображается буква, в этом случае его можно заполнить от 0 до 24, потому что это доска 5x5.   -  person WalidY    schedule 06.03.2014
comment
Когда я пишу в методе initComponents r.getLetters()[20].setText(B); он работает и показывает мне это при запуске доски: puu.sh/7l4KB.png   -  person WalidY    schedule 06.03.2014
comment
Возможный дубликат: stackoverflow.com/questions/8074316 /   -  person Nick Rippe    schedule 06.03.2014


Ответы (1)


Без MCTRE будет немного сложно определить точную причину вашей проблемы, но я предполагаю, что корень ваша проблема в том, что вы используете Key Listeners вместо Key Bindings.

KeyListener очень разборчив в том, какой компонент сфокусирован, что, вероятно, является проблемой, с которой вы столкнулись. Он не сработает, если компонент, к которому он был добавлен, не имеет фокуса приложения (поэтому его не идеально использовать с контейнерами). Вот краткий пример использования привязки ключей:

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);
    }
}
person Nick Rippe    schedule 06.03.2014