Mit KeyListener Farbe von Label ändern

MateMalte

Mitglied
Hi,
mein Ziel ist es mit JLabels eine Tastatur nachzustellen und immer wenn eine Taste auf der Tastatur gedrückt wird, dann soll die Taste im Programm die Farbe ändern. Wird die Taste wieder losgelassen, dann soll die Taste im Programm aufhören zu "leuchten". Das habe ich bereits geschrieben:
Code:
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JFrame{

    JLabel buchstabe;
    int number = 0;
    
    public Window() {   
        setVisible(true);
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setTitle("Enigma");
        setResizable(false);
        setLayout(null);
        
        buchstabe = new JLabel("Hallo Welt");
        buchstabe.setBounds(100, 50, 100, 10);;
        add(buchstabe);
        
        buchstabe.addKeyListener(new KeyListener() {
            
            public void keyTyped(KeyEvent e) {
                
            }
        
            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_E) {
                    number = 0;
                }
            }
            
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_E) {
                    buchstabe.setBackground(Color.RED);
                }
            }
        });
    }
}
Vielen Dank für eure Hilfe.
 
K

kneitzel

Gast
Ich würde vermuten, dass der Scope vom Key Listener nicht stimmt. Statt beim Label würde ich das beim Window setzen.
So dürfte das Event nur ausgelöst werden, wenn das Label den Fokus hat ....
 

Javinner

Top Contributor
Mal auf die Schnelle ein ausbaufähiger Code:
Java:
public class SpassMitHelloWorldDemo
{

    private final static String HELLO_WORLD = "Hello World";

    private final JFrame frame;
    private final JLabel label;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(SpassMitHelloWorldDemo::new);

    }

    public SpassMitHelloWorldDemo()
    {
        this.frame = new JFrame();
        this.frame.setSize(100, 100);
        this.frame.setLayout(new BorderLayout());
        this.frame.setLocationRelativeTo(null);
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.frame.addKeyListener(new KeyHandler());
        this.frame.setFocusable(true);

        this.label = new JLabel(HELLO_WORLD, JLabel.CENTER);
        this.frame.add(this.label, BorderLayout.CENTER);
        this.frame.setVisible(true);

    }

    private class KeyHandler extends KeyAdapter
    {

        @Override
        public void keyPressed(KeyEvent e)
        {
            char to_search = e.getKeyChar();
            String string = label.getText();
            char[] array = string.toCharArray();
            for (char c : array)
            {
                if (c == to_search)
                {
                    label.setForeground(Color.RED);
                }
            }

        }

        @Override
        public void keyReleased(KeyEvent e)
        {
            label.setForeground(Color.BLACK);
        }

    }

}
Wenn ein Buchstabe, welcher im Text vorkommt, getippt (und gehalten) wird, färbt sich der Text rot.
Sobald du die Taste loslässt färbt sich der Text wieder Schwarz.

Versuch doch mal nur den Buchstaben, der getippt wurde, Rot zu färben ;)
 
K

kneitzel

Gast
Um meinen Punkt mit dem Beispiel von Javinner zu verdeutlichen:
Java:
buchstabe.addKeyListener(new KeyListener() {
=> Auf dem JLabel bringt der KeyListener nichts ...

Java:
this.frame.addKeyListener(new KeyHandler());
=> Auf dem Frame bringt der Key Listener etwas ... zumindest so lange der Frame den Focus hat.
 

MateMalte

Mitglied
Jetzt habe ein weiteres Problem. Die Tastatur leuchtet auf wenn ich das will und die eingetippt Buchstaben werden jetzt in einer TextArea ausgegeben. Das Ziel ist die Simulation einer Enigma und die Rotoren will ich mit Spinnern ermöglichen. Es sind drei Spinner mit je der Voreinstellung 1. Doch will ich diese Einstellung manuell im Programm ändern, so ist es nicht mehr möglich die eigentlich Funktion, das Anschlagen einer Taste, das daraus folgende aufleuchten eines Labels und die Ausgabe des Buchstabes in einem Label, nicht mehr möglich. wie könnte ich es schaffen, dass ich die Einstellung ändern kann und danach auch die Hauptfunktion wieder aktiv ist?
 

mihe7

Top Contributor
die eigentlich Funktion, das Anschlagen einer Taste, das daraus folgende aufleuchten eines Labels und die Ausgabe des Buchstabes in einem Label, nicht mehr möglich. wie könnte ich es schaffen, dass ich die Einstellung ändern kann und danach auch die Hauptfunktion wieder aktiv ist?
Ich versteh nur Bahnhof. Was soll warum nicht mehr möglich sein?
 
X

Xyz1

Gast
Das Ziel ist die Simulation einer Enigma und die Rotoren will ich mit Spinnern ermöglichen. Es sind drei Spinner mit je der Voreinstellung 1. Doch will ich diese Einstellung manuell im Programm ändern, so ist es nicht mehr möglich die eigentlich Funktion, das Anschlagen einer Taste, das daraus folgende aufleuchten eines Labels und die Ausgabe des Buchstabes in einem Label, nicht mehr möglich. wie könnte ich es schaffen, dass ich die Einstellung ändern kann und danach auch die Hauptfunktion wieder aktiv ist?
Hokus Pokus Fidibus :rolleyes:

Ehrlich ich verstehe auch kein Wort... Hast Du diesen Text händisch obfuskiiert? :(

Ich tippe mal auf ein vergessenes, hinzuzufügendes Boolean Flag...
 

Blender3D

Top Contributor
Hi,
mein Ziel ist es mit JLabels eine Tastatur nachzustellen und immer wenn eine Taste auf der Tastatur gedrückt wird, dann soll die Taste im Programm die Farbe ändern. Wird die Taste wieder losgelassen, dann soll die Taste im Programm aufhören zu "leuchten". Das habe ich bereits geschrieben:
Habe früher einmal zu Testzwecken einen Code für eine Mouse Tastatur geschrieben. Vielleicht kannst Du damit etwas anfangen.
11787
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;

@SuppressWarnings("serial")
public class KeyBoardPanel extends JComponent {
    public final static String[] key = { "1234567890ß´", "qwertzuiopü+", "asdfghjklöä#", "yxcvbnm,.- " };
    public final static String[] keyShift = { "!\"§$%&/()=?´", "QWERTZUIOPÜ*", "ASDFGHJKLÖÄ'", "YXCVBNM;:- " };

    private String[] board = key;
    private int boardWidth = 0;
    private int boardHeight = 0;
    private int keyWidth = 0;
    private int lineHeight = 0;
    private final int NUM_KEY_LINE = 12;
    private Point origin = new Point();
    private Point clickedKey = null;
    private char keyPressed = 0;
    private Color colorPressed = Color.WHITE;
    private Color colorClick = Color.RED;
    private Color colorBack = Color.LIGHT_GRAY;
    private KeyBoardListener listener = null;

    public KeyBoardPanel() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                Point pos = e.getPoint();
                Rectangle rect = getBoardBounds();
                if (!rect.contains(pos))
                    return;
                int x = (pos.x - origin.x) / keyWidth;
                int y = (pos.y - origin.y) / lineHeight;
                if (isShiftKey(x, y))
                    setShift(!isShift());
                else {
                    clickedKey = new Point(x, y);
                    keyPressed = isDeleteKey(x, y) ? KeyEvent.VK_DELETE : board[clickedKey.y].charAt(clickedKey.x);
                    if (listener != null)
                        listener.update(this, keyPressed, x, y, isShift());
                }
                repaint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                clickedKey = null;
                repaint();
            }
        });
    }

    @Override
    public void addNotify() {
        super.addNotify();
        updateDimension();
    }

    private void drawKeyBoard(Graphics g) {
        int x = origin.x;
        int y = origin.y;
        g.setColor(colorBack);
        Rectangle rect = getBoardBounds();
        g.fillRect(rect.x, rect.y, rect.width, rect.height);

        if (clickedKey != null) {
            g.setColor(colorClick);
            g.fillRect(origin.x + clickedKey.x * keyWidth, origin.y + clickedKey.y * lineHeight, keyWidth, lineHeight);
        }
        g.setColor(getForeground());
        g.drawRect(rect.x, rect.y, rect.width, rect.height);

        drawDelete(g);

        drawShift(g);
        for (int i = 0; i < board.length; i++) {
            int yy = y + lineHeight;
            if (i < board.length - 1)
                g.drawLine(x, yy, x + boardWidth, yy);
            for (int ii = 0; ii < board[i].length(); ii++) {
                if (i == 0 && ii != 0) {
                    int xx = x + ii * keyWidth;
                    g.drawLine(xx, y, xx, y + boardHeight);
                }
                char c = board[i].charAt(ii);
                if (c == keyPressed)
                    g.setColor(colorPressed);
                g.drawString(c + "", x + ii * keyWidth + keyWidth / 4, y + lineHeight - lineHeight / 3);
                g.setColor(getForeground());
            }
            y += lineHeight;
        }
    }

    private void drawDelete(Graphics g) {
        if (!isShift())
            return;
        int x = keyWidth * (board[0].length() - 1) - keyWidth / 4 - 1;
        int y = lineHeight * board.length;
        Font old = g.getFont();
        g.setFont(old.deriveFont(old.getSize() / 2f));
        g.drawString("del", x, y);
        g.setFont(old);

    }

    private void drawShift(Graphics g) {
        int x = keyWidth * board[0].length() - keyWidth / 4;
        int y = lineHeight * board.length - lineHeight / 3;

        g.setColor(isShift() ? colorPressed.darker() : colorPressed);
        g.fillOval(x, y, keyWidth / 2, keyWidth / 2);
        g.setColor(getForeground());
    }

    public Rectangle getBoardBounds() {
        return new Rectangle(origin.x, origin.y, boardWidth, lineHeight * 4);
    }

    public char getKeyPressed() {
        return keyPressed;
    }

    private boolean isDeleteKey(int x, int y) {
        return isShift() && (x == NUM_KEY_LINE - 2 && y == key.length - 1);
    }

    public boolean isShift() {
        return board == keyShift;
    }

    private boolean isShiftKey(int x, int y) {
        return x == NUM_KEY_LINE - 1 && y == key.length - 1;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        RenderingHints rh = new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2.setRenderingHints(rh);
        drawKeyBoard(g);
    }

    public void setColorBack(Color colorBack) {
        this.colorBack = colorBack;
    }

    public void setColorClick(Color colorClick) {
        this.colorClick = colorClick;
    }

    public void setColorPressed(Color colorPressed) {
        this.colorPressed = colorPressed;
    }

    @Override
    public void setFont(Font font) {
        super.setFont(font);
        updateDimension();
    }

    public void setKeyBoardListener(KeyBoardListener listener) {
        this.listener = listener;
    }

    public void setShift(boolean ok) {
        board = ok ? keyShift : key;
    }

    private void updateDimension() {
        Font font = getFont();
        FontMetrics fm = getFontMetrics(font);
        keyWidth = fm.stringWidth("O") * 2;
        lineHeight = font.getSize() * 2;
        int width = (NUM_KEY_LINE + 1) * keyWidth;
        int height = lineHeight * key.length + keyWidth;
        boardWidth = NUM_KEY_LINE * keyWidth;
        boardHeight = lineHeight * 4;
        origin.x = (width - boardWidth) / 2;
        origin.y = (height - 4 * lineHeight) / 2;
        setPreferredSize(new Dimension(width, height));
    }
}
Java:
public interface KeyBoardListener {
    public void update(Object src, char key, int x, int y, boolean shift);
}
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;

@SuppressWarnings("serial")
public class TestKeyBoard extends JComponent implements KeyBoardListener {
    private KeyBoardPanel keyboard = new KeyBoardPanel();
    private JLabel label = new JLabel("", JLabel.CENTER);

    public TestKeyBoard() {
        Font font = new Font("Courier", Font.BOLD, 20);
        keyboard.setFont(font);
        keyboard.setKeyBoardListener(this);
        Dimension dim = keyboard.getPreferredSize();
        dim.height += font.getSize();
        setPreferredSize(dim);

        label.setPreferredSize(new Dimension(keyboard.getBoardBounds().width, font.getSize()));
        label.setBorder(BorderFactory.createLineBorder(Color.YELLOW));
        label.setForeground(Color.YELLOW);
        label.setBackground(Color.BLACK);
        label.setOpaque(true);
        setLayout(new BorderLayout());
        add(keyboard, BorderLayout.CENTER);
        add(label, BorderLayout.NORTH);

    }

    @Override
    public void update(Object src, char key, int x, int y, boolean shift) {
        String text = label.getText();
        if (key == KeyEvent.VK_DELETE) {
            if (text.length() > 0)
                text = text.substring(0, text.length() - 1);
        } else
            text += key;
        label.setText(text);
    }

}
Java:
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Keyboard");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TestKeyBoard());
        frame.pack();
        frame.setVisible(true);
    }
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
M KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
N Java Keylistener Java Basics - Anfänger-Themen 2
B KeyListener funkioniert nicht Java Basics - Anfänger-Themen 2
F KeyListener Java Basics - Anfänger-Themen 3
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
J-Gallus Keylistener verstehen Java Basics - Anfänger-Themen 17
S Keylistener Java Basics - Anfänger-Themen 16
S Keylistener im Grafikfenster Java Basics - Anfänger-Themen 3
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
N KeyListener in Thread Java Basics - Anfänger-Themen 0
LexeB4F for schliefe in KeyListener Java Basics - Anfänger-Themen 3
R KeyListener auslagern Java Basics - Anfänger-Themen 3
J KeyListener aus anderer Klasse bereitet Probleme Java Basics - Anfänger-Themen 1
Z KeyListener funktioniert nicht? Weshalb? Java Basics - Anfänger-Themen 8
T KeyListener Java Basics - Anfänger-Themen 2
Gfreak23 Input/Output KeyListener funktioniert auf Laptop nicht allerdings auf Tower-PC Java Basics - Anfänger-Themen 8
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
TheSorm KeyListener Problem Java Basics - Anfänger-Themen 4
M KeyListener Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
D KeyListener nicht mehr aktiv nach ActionPerformed Java Basics - Anfänger-Themen 2
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
L Input/Output Java 3D mit KeyListener Java Basics - Anfänger-Themen 1
S KeyListener reagiert nicht. Java Basics - Anfänger-Themen 4
L KeyListener ohne textfeld Java Basics - Anfänger-Themen 4
J KeyListener,MouseListener,MouseMotionListener und static Java Basics - Anfänger-Themen 7
P Klassen Bei KeyEvent in KeyListener den Tastendruck abbrechen Java Basics - Anfänger-Themen 5
B KeyListener als allgemeine Methode Java Basics - Anfänger-Themen 5
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
0 KeyListener ausserhalb der Applikation Java Basics - Anfänger-Themen 5
G KeyListener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
J KeyListener funtioniert nicht! Java Basics - Anfänger-Themen 3
J KeyListener Java Basics - Anfänger-Themen 11
P Input/Output KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
G KeyListener, Fokus Java Basics - Anfänger-Themen 8
K Input/Output KeyListener funktioniert nicht Java Basics - Anfänger-Themen 3
A Input/Output Keylistener Aktiv schalten Java Basics - Anfänger-Themen 8
J keyListener - Genau 1 Aktion soll bei 1 Tastenausdruck ausgeführt werden Java Basics - Anfänger-Themen 11
S KeyListener Java Basics - Anfänger-Themen 2
A Erste Schritte Problem mit KeyListener Java Basics - Anfänger-Themen 6
Maxim6394 KeyListener geht nicht Java Basics - Anfänger-Themen 15
A Wie KeyListener adden? Java Basics - Anfänger-Themen 15
Maxim6394 KeyListener funktioniert nicht Java Basics - Anfänger-Themen 20
U KeyListener StackOverflowError Java Basics - Anfänger-Themen 2
W KeyListener auf Applet mit Runnable Java Basics - Anfänger-Themen 4
M Apfel-Spiel KeyListener Java Basics - Anfänger-Themen 33
J KeyListener (keyTyped) funktioniert nicht Java Basics - Anfänger-Themen 9
Luk10 KeyListener Java Basics - Anfänger-Themen 13
S KeyListener aus anderer Klasse hinzufügen Java Basics - Anfänger-Themen 19
P KeyListener im Applet Java Basics - Anfänger-Themen 2
S KeyListener-Anwendung Java Basics - Anfänger-Themen 7
O KeyListener funktioniert nur wenn er will Java Basics - Anfänger-Themen 2
A KeyListener funzt ned Java Basics - Anfänger-Themen 6
D KeyListener, Unterscheidung Groß/Kleinbuchstaben Java Basics - Anfänger-Themen 3
S KeyListener als class? Java Basics - Anfänger-Themen 4
F Applet mit KeyListener, "Alt"-Taste und Konflikt mit Browser Java Basics - Anfänger-Themen 2
P KeyListener Java Basics - Anfänger-Themen 2
S KeyListener für einfaches Programm Java Basics - Anfänger-Themen 3
S KeyListener aktiv auch wenn minimiert? Java Basics - Anfänger-Themen 4
Z Globaler Keylistener Java Basics - Anfänger-Themen 2
V KeyListener Beispiel Java Basics - Anfänger-Themen 13
T canvas killt KeyListener Java Basics - Anfänger-Themen 2
Das Brot Nach .add(JRadioButton) funktioniert der KeyListener nicht mehr Java Basics - Anfänger-Themen 2
J Keylistener aber wie jTextField auswahl? Java Basics - Anfänger-Themen 3
D KeyListener, nichts passiert Java Basics - Anfänger-Themen 6
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2
D Keylistener zu langsam Java Basics - Anfänger-Themen 7
C Problem mit JPopupMenu, JTextField und Keylistener Java Basics - Anfänger-Themen 2
G Keylistener in einer Schleife Java Basics - Anfänger-Themen 9
M problem mit keylistener Java Basics - Anfänger-Themen 2
M TabbedPane: KeyListener funktioniert nicht mehr Java Basics - Anfänger-Themen 8
N KeyListener ohne GUI? Java Basics - Anfänger-Themen 5
M KeyListener Java Basics - Anfänger-Themen 3
T KeyListener wird nicht ausgelöst Java Basics - Anfänger-Themen 6
O KeyListener Java Basics - Anfänger-Themen 8
Developer_X KeyListener ohne JFrame Java Basics - Anfänger-Themen 13
H KeyListener Java Basics - Anfänger-Themen 4
Developer_X KeyListener Actions (hat mit Java3D zu tun) Java Basics - Anfänger-Themen 20
H KeyListener funktioniert nicht Java Basics - Anfänger-Themen 8
Developer_X JFrame soll KeyListener adden Java Basics - Anfänger-Themen 32
F Keylistener Java Basics - Anfänger-Themen 12
hdi KeyListener : keyTyped() nicht nutzbar? Java Basics - Anfänger-Themen 1
StickToFreak Runnable + KeyListener? Java Basics - Anfänger-Themen 32
dl85hej Keylistener Java Basics - Anfänger-Themen 16
H KeyListener will nicht reagieren Java Basics - Anfänger-Themen 5
R Fehlersuche - KeyListener, KeyAdaper - Nichts Klappt! Java Basics - Anfänger-Themen 2
G Prob. mit KeyListener und Unterklasse Java Basics - Anfänger-Themen 5
G Keylistener nur besimmte Zeichen zulassen Java Basics - Anfänger-Themen 8
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
A KeyListener funktioniert nicht Java Basics - Anfänger-Themen 7
D KeyListener Java Basics - Anfänger-Themen 7
B Keylistener auf JSpinner reagiert nicht? Java Basics - Anfänger-Themen 3
G KeyListener für die Taste "/" Java Basics - Anfänger-Themen 5
E brauche hilfe beim KeyListener Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben