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.
 
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 ....
 
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 😉
 
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.
 
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?
 
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?
 
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 🙄

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

Ich tippe mal auf ein vergessenes, hinzuzufügendes Boolean Flag...
 
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:

Neue Themen


Zurück
Oben