selbstgeschrieben Texteditor: empfangen von KeyEvents

Kevin94

Top Contributor
Hallo,

ich habe mir ein Texteditor mit "Syntaxhighliting" geschrieben. Die Datenhaltung, sowie die Zeichenmethode funktionieren wie gewünscht.
Das Problem ist die Eingabe von der Tastatur, mein Klasse implementiert KeyListener, die Methoden funktionieren auch, aber nur wenn ich die Instanz des editors als KeyListener am gesamten JFrame anmelde, sodass dann alle KeyEvents für das Gesamte Fenster abgefangen werden.
Wenn ich dagegen den KeyListener beim editor (also bei der eigenen Instanz) anmelde gehen keine KeyEvents ein.

Code:
Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import javax.swing.*;

public class Compiler extends JComponent implements KeyListener
{
    private static HashMap<String,Type> names;
    private static HashMap<String,Integer> constants;
    private Vector<StringBuffer> text;
    private int line,pos,editl;
    private Clipboard sysclip;
    private JButton inter,gener,save,exec;
    private JEditorPane neu;
    private JTextField num,name;
    private GridBagRef ref=new GridBagRef();
    
    public Compiler()
    {
        JFrame f=new JFrame("Bytecode Compiler");
        f.setLayout(new GridBagLayout());
        f.setVisible(true);
        f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
        neu=new JEditorPane();
        num=new JTextField();
        name=new JTextField();
        inter=new JButton("Übersetzen");
        exec=new JButton("Ausführen");
        gener=new JButton("LUA Methode generieren");
        save=new JButton("Speichern");
        f.setLayout(new GridBagLayout());
        JPanel l=new JPanel(),r=new JPanel();
        f.add(l,ref.e);
        f.add(r,ref.d);
        l.setLayout(new GridBagLayout());
        l.add(num,ref.d);
        l.add(neu,ref.f);
        l.add(new JLabel(),ref.g);
        l.add(gener,ref.h);
        r.setLayout(new GridBagLayout());
        r.add(name,ref.d);
        r.add(this,ref.f);
        r.add(new JLabel(),ref.g);
        r.add(exec,ref.i);
        r.add(save,ref.c);
        r.add(inter,ref.h);
        
        text=new Vector<StringBuffer>();
        text.add(new StringBuffer());
        sysclip = Toolkit.getDefaultToolkit().getSystemClipboard();
        
        setPreferredSize(new Dimension(200,200));
        f.pack();
        
        addKeyListener(this);
        
    }
    public String getText()
    {
        String tmp="";
        for(StringBuffer akt: text)
        tmp+=new String(akt)+" \n";
        return tmp;
    }
    
    public void keyPressed(KeyEvent e)
    {
        int code=e.getKeyCode(),len=text.get(line).length();
        boolean control=e.isControlDown();
        boolean shift=e.isShiftDown();
        if((code==e.VK_UP || code==e.VK_NUMPAD8) &&line>0 && !shift )
        {
            line--;
            if(pos>len)
            pos=len-1;
        }
        else if((code==e.VK_DOWN || code==e.VK_NUMPAD2) && line<text.size()-1 && !shift)
        {
            line++;
            if(pos>len)
            pos=len-1;
        }
        else if((code==e.VK_LEFT || code==e.VK_NUMPAD4) && pos>0&& !shift)
        {
            pos--;
        }
        else if((code==e.VK_LEFT || code==e.VK_NUMPAD4) && pos>0&& shift)
        {
            editl--;
        }
        else if((code==e.VK_RIGHT || code==e.VK_NUMPAD6) && pos<len&& !shift)
        {
            pos++;
        }
        else if((code==e.VK_RIGHT || code==e.VK_NUMPAD6) && pos<len&& shift)
        {
            editl++;
        }
        else if(code==e.VK_BACK_SPACE && len>0 && pos<len)
        {
            if(editl==0)
            text.get(line).deleteCharAt(pos==0?pos:pos--);
            else if(editl>0)
            {
                text.get(line).delete(pos,pos+editl);
                editl=0;
            }
            else
            {
                text.get(line).delete(pos+editl,pos);
                pos+=editl;editl=0;
            }
        }
        else if(code==e.VK_BACK_SPACE && len==0 &&text.size()>1)
        {
            text.remove(text.get(line>0?line--:line));
        }
        else if(control)
        {
            switch(code)
            {
                case 'C':
                {
                    if(editl==0)
                    return;
                    else if(editl>0)
                    {
                        String tmp=text.get(line).substring(pos,pos+editl);
                        StringSelection trans=new StringSelection(tmp);
                        sysclip.setContents(trans,null);
                    }
                    else
                    {
                        String tmp=text.get(line).substring(pos+editl,pos);
                        StringSelection trans=new StringSelection(tmp);
                        sysclip.setContents(trans,null);
                    }
                    break;
                }
                case 'V':
                {
                    try
                    {
                        Transferable transfer = sysclip.getContents( null );
                        String data = (String) transfer.getTransferData( DataFlavor.stringFlavor );
                        text.get(line).insert(pos,data);
                        pos+=data.length();
                    }
                    catch(UnsupportedFlavorException ex)
                    {
                        System.err.println("Kein String in der Zwischenalage");
                    }
                    catch(IOException ex)
                    {
                        System.err.println("IOException");
                    }
                    break;
                }
                case 'X':
                {
                    if(editl==0)
                    return;
                    else if(editl>0)
                    {
                        String tmp=text.get(line).substring(pos,pos+editl);
                        text.get(line).delete(pos,pos+editl);
                        StringSelection trans=new StringSelection(tmp);
                        sysclip.setContents(trans,null);
                    }
                    else
                    {
                        String tmp=text.get(line).substring(pos+editl,pos);
                        text.get(line).delete(pos+editl,pos);
                        StringSelection trans=new StringSelection(tmp);
                        sysclip.setContents(trans,null);
                    }
                    
                    break;
                }
                case 'A':
                {
                    pos=0;
                    editl=text.get(line).length();
                    break;
                }
                
            }
        }
        else
        return;
        repaint();
    }
    
    public void keyTyped(KeyEvent e)
    {
        char c=e.getKeyChar();
        if(c=='\n')
        {
            text.insertElementAt(new StringBuffer(),++line);
            pos=0;
        }
        else if(c>31)
        {
            text.get(line).insert(pos++,c);
        }
        else
        return;
        repaint();
    }
    
    public void keyReleased(KeyEvent e){}
    
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0,0,getWidth(),getHeight());
        Font font=new Font("Times New Roman",Font.PLAIN,20);
        FontMetrics metric=g.getFontMetrics(font);
        g.setFont(font);
        int height=metric.getHeight();
        for(int i=0;i<text.size();i++)
        {
            String akt=new String(text.get(i));
            Scanner sc=new Scanner(akt);
            int j=0;
            while(sc.hasNext())
            {
                String tmp=sc.next();
                if(tmp.startsWith("#"))
                g.setColor(new Color(0,160,0));//darkgreen
                else if(names.containsKey(tmp))
                g.setColor(Color.blue);
                else if (isNumber(tmp))
                g.setColor(Color.red);
                else
                g.setColor(Color.black);
                g.drawString(tmp,10+metric.stringWidth(akt.substring(0,j)),height*(i+1));
                j+=tmp.length()+1;
            }
        }
        g.setColor(Color.black);
        int xpos=10+metric.stringWidth(new String(text.get(line)).substring(0,pos));
        if(editl==0)
        g.drawLine(xpos,height*(line),xpos,height*(line+1));
        else if(editl>0)
        {
            int xpos2=10+metric.stringWidth(new String(text.get(line)).substring(0,pos+editl));
            g.setXORMode(Color.white);
            g.fillRect(xpos,height*line,xpos2-xpos,height);
            g.setPaintMode();
        }
        else
        {
            int xpos2=10+metric.stringWidth(new String(text.get(line)).substring(0,pos+editl));
            g.setXORMode(Color.white);
            g.fillRect(xpos2,height*line,xpos-xpos2,height);
            g.setPaintMode();
        }
    }

    private static boolean isNumber(String test)
    {
        try
        {
            Integer.decode(test);
            return true;
        }
        catch(Exception ex)
        {
            return false;
        }
        
    }
    
}

Die Klassen Save,GridBagRef und Type sind selbstgeschreiben und befinden sich im selben Package
GridBagRef ist eine sammlung von GridBagConstraints Konstaten.

Falls es jemandem hilft: ich programmiere mit BlueJ und mein Betriebssystem ist Win7

Schon mal vielen dank,

Kevin
 
G

Gast2

Gast
KeyEvents bekommst du nur wenn dein Editor den Focus hat und keine andere Componente.
Du kannst die ActionMap überschreiben oder KeyBindings benutzen.
 

Kevin94

Top Contributor
danke, ich hab jetzt eine lösung gefunden:
meine klasse implementiert zusätzlich MouseListener

Java:
addMouseListener(this);
im Konstruktor einfügen und das Wichtigste:

Java:
public void mouseClicked(MouseEvent e)//wird jedesmal aufgerufen wenn die Component angeklickt wird
    {
        this.requestFocusInWindow();//Fordert den Focus für das Component an
    }

die restlichen Methoden sind leer
 

Ähnliche Java Themen

Neue Themen


Oben