tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
16
ZUGRIFFE
5582
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PeteProgram PeteProgram ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Beiträge
    75
    Hallo

    folgendes Problem kann ich nicht lösen:

    Ich habe ein JTextField und füge diesem einen KeyListener hinzu. Durch keyReleased wird ein JPopupMenu, genauer ein BasicComboPopup geöffnet. Nun würde ich gerne über dieses PopupMenu mit den Cursortasten eine Auswahl treffen, leider bekommt das PopupMenu keinen Focus und ich kann es nicht mit der Tastatur verwenden.

    requestFocus() als auch requestFocusInWindow() haben sowohl im Konstruktor als auch in keysReleased() nix gebracht.

    Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    package test.textfield;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.plaf.basic.BasicComboPopup;
    import javax.swing.text.DefaultCaret;
    public class TextFieldPopup extends BasicComboPopup {
     
     private static String[] items = {"eins","zwei","drei","vier","fünf"};
     
     public static JTextField jt = new JTextField(20); 
     
     public TextFieldPopup()  {
      super(new JComboBox(items));
     }
     public static void main(String[] args) {
      JFrame jf = new JFrame();
     
      jt.addKeyListener(new MyKeyListener());
      jf.getContentPane().add(jt);
     
      jf.pack();
      jf.setVisible(true);
     }
     
     static class MyKeyListener implements KeyListener  {
      public void keyTyped(KeyEvent e) {
      }
      public void keyPressed(KeyEvent e) {
      }
      public void keyReleased(KeyEvent e) {
       TextFieldPopup tfp = new TextFieldPopup();
       DefaultCaret bc = (DefaultCaret)jt.getCaret();
       tfp.show(jt,bc.x,bc.y);
      }
     }
    }

    sollte übrigens nicht daran liegen, das einige Felder und der Listener static sind, weil ich den Code für diese Frage fix zusammengebaut habe und ansonsten alles "nicht-static" ist.

    weiß jemand ein Lösung?
     

  2. #2
    dadom110 dadom110 ist offline Mitglied Brokat
    Registriert seit
    Nov 2005
    Beiträge
    252
    Moin,

    weiss nicht ob ich es richtig verstanden habe, wenn nicht, auch egal:

    Hab deine ComboBox mal explizit erzeugt, und ihr nen zusätzlichen ActionListener zugewiesen, der das klicken auf dieser abfängt.


    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
     
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.plaf.basic.BasicComboPopup;
    import javax.swing.text.DefaultCaret;
     
    import com.sun.corba.se.spi.orbutil.fsm.Action;
    public class TextFieldPopup extends BasicComboPopup {
        
     private static String[] items = {"eins","zwei","drei","vier","fünf"};
     static JComboBox cbb=new JComboBox(items);
     public static JTextField jt = new JTextField(20); 
     
     public TextFieldPopup()  {
         super(cbb);
     
     }
     public static void main(String[] args) {
      JFrame jf = new JFrame();
     
      jt.addKeyListener(new MyKeyListener());
      jf.getContentPane().add(jt);
     
      jf.pack();
      jf.setVisible(true);
     
       ActionListener AL=new ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent arg0) 
           {
               //Was du mit dem Menüeintrag auch immer machen willst...
               System.out.println(cbb.getSelectedItem().toString());
           }
       };
       cbb.addActionListener(AL);
     }
     
     static class MyKeyListener implements KeyListener  {
      public void keyTyped(KeyEvent e) {
      }
      public void keyPressed(KeyEvent e) {
      }
      public void keyReleased(KeyEvent e) {
       TextFieldPopup tfp = new TextFieldPopup();
       DefaultCaret bc = (DefaultCaret)jt.getCaret();
       tfp.show(jt,bc.x,bc.y);
     
      }
     }
    }

    Wenns so passt: Bitte gern geschehen, Wenns daneben ging: *duckundweg*

    grüße
    Dom
    Geändert von dadom110 (22.03.06 um 15:31 Uhr)
     

  3. #3
    dadom110 dadom110 ist offline Mitglied Brokat
    Registriert seit
    Nov 2005
    Beiträge
    252
    Moin ich noch mal,

    deine Frage noch mal überdacht, bzw noch mal gelesen, das du das ganze mit den Tasten auswählen willst, grade keine Zeit nen Code zu basteln, aber das Problem liegt darin, das meiner Ansicht nach die Pfeiltasten auf der Textbox ebenfalls ein "KeyEvent" auslösen, somit wird quasi der Menüeintrag makiert, bzw der Menü Eintrag darunter oder darüber ausgewählt, dann aber ein neues PopUpMenü erzeugt (KeyEvent : release), in dem das erste Item wieder makiert ist.

    Mfg
    Dom
     

  4. #4
    PeteProgram PeteProgram ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Beiträge
    75
    Ja das ist das Problem, es sollte sich rein theoretisch lösen, wenn das PopupMenu beim "Erscheinen" den Focus bekommen würde, weil dann (ebenfalls theoretisch) der KeyListener nix empfangen würde - oder?
     

  5. #5
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Pete,

    wie wärs mit einer Combobox mit Autovervollständigung, oder muss es unbedingt ein reines Textfeld sein?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
     
    public class ComboExtended extends JFrame implements KeyListener {
     
        String[] items = { "", "eins", "zwei", "drei", "vier", "fünf" };
     
        JList helplist = new JList(items);
     
        JTextComponent comboeditor;
     
        JComboBox combo = new JComboBox(items);
     
        public ComboExtended() {
            combo.setEditable(true);
            comboeditor = (JTextComponent) combo.getComponent(2);
     
            add(combo);
     
            comboeditor.addKeyListener(this);
     
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            setVisible(true);
        }
     
        public static void main(String[] args) {
            new ComboExtended();
        }
     
        public void keyTyped(KeyEvent e) {
        }
     
        public void keyPressed(KeyEvent e) {
        }
     
        public void keyReleased(KeyEvent e) {
            int index = -1;
            if (!comboeditor.getText().equals(""))
                index = helplist.getNextMatch(comboeditor.getText(), 1,
                        Position.Bias.Forward);
     
            if (index != -1) {
                combo.setSelectedIndex(index);
                combo.showPopup();
            } else
                combo.hidePopup();
        }
    }

    Vg Erdal
     

  6. #6
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Pete,

    hier jetzt ein JTextField mit Popup:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
     
    public class TextFieldExtended extends JFrame implements KeyListener {
     
        String[] items = { "auto", "apfel", "rot", "regen", "birne", "blau",
                "benzin", "gelb","blaue"};
     
        JList list = new JList(items);
     
        JTextField textfeld = new JTextField(20);
     
        JScrollPane scroll = new JScrollPane(list);
     
        JPopupMenu pop = new JPopupMenu();
        
        DefaultCaret dcaret = (DefaultCaret) textfeld.getCaret();
     
        public TextFieldExtended() {
     
            list.setFocusable(false);
            scroll.getVerticalScrollBar().setFocusable(false);
            scroll.getHorizontalScrollBar().setFocusable(false);
     
            scroll.setBorder(null);
            pop.add(scroll);
     
            add(textfeld);
     
            setLocationByPlatform(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            setVisible(true);
     
            textfeld.addKeyListener(this);
            pop.addKeyListener(this);
        }
     
        public static void main(String[] args) {
            new TextFieldExtended();
        }
     
        public void keyTyped(KeyEvent e) {
     
        }
     
        public void keyPressed(KeyEvent e) {
        }
     
        public void keyReleased(KeyEvent e) {
            switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN:
                list.setSelectedIndex(list.getSelectedIndex() + 1);
                break;
            case KeyEvent.VK_UP:
                list.setSelectedIndex(list.getSelectedIndex() - 1);
                break;
            case KeyEvent.VK_ENTER:
                if (pop.isShowing())
                    textfeld.setText(list.getSelectedValue().toString());
                break;
            default: {
                int index = -1;
                if (!textfeld.getText().equals(""))
                    index = list.getNextMatch(textfeld.getText(), 1,
                            Position.Bias.Forward);
     
                if (index != -1) {
                    list.setSelectedIndex(index);
                    pop.setLocation((int) textfeld.getLocationOnScreen().getX()
                            + dcaret.x, (int) textfeld.getLocationOnScreen().getY()
                            + textfeld.getHeight());
                    pop
                            .show(textfeld, dcaret.x, textfeld.getY()
                                    + textfeld.getHeight());
                } else
                    pop.setVisible(false);
                textfeld.requestFocus();
     
            }
            }
            if (list.getSelectedValue() != null
                    && list.getSelectedValue().equals(textfeld.getText()))
                pop.setVisible(false);
        }
    }

    Vg Erdal
     

  7. #7
    PeteProgram PeteProgram ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Beiträge
    75
    Dankeschön
     

  8. #8
    PeteProgram PeteProgram ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Beiträge
    75
    Wie kann man nun auf das Popup-Menu einen KeyListener bringen?
     

  9. #9
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Pete,

    Wenn du genau hinschaust, im letzten Beispiel ist ein KeyListener integriert.


    Vg Erdal
     

  10. #10
    PeteProgram PeteProgram ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Beiträge
    75
    Okay - Entschuldige ich meinte Mouselistener, aber da Du nicht mit einer JComboBox (so wie ich) sondern mit einer JList gearbeitet hast, sollte man da die Mouseselection ganz einfach rausbekommen können.

    Danke
     

  11. #11
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Pete,

    hab im Konstruktor der JList einen MouseListener hinzugefügt. Bei einfachem Klick wird das entsprechende Wort in das Textfeld eingefügt, das Popup bleibt jedoch offen. Durch Doppelklick wird sowohl das selektierte Wort eingefügt als auch das Popup geschlossen.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    
    import java.awt.event.*;
     
    import javax.swing.*;
    import javax.swing.text.DefaultCaret;
    import javax.swing.text.Position;
     
    public class TextFieldExtended extends JFrame implements KeyListener {
     
        String[] items = { "auto", "apfel", "rot", "regen", "birne", "blau",
                "benzin", "gelb", "blaue" };
     
        JList list = new JList(items);
     
        JTextField textfeld = new JTextField(20);
     
        JScrollPane scroll = new JScrollPane(list);
     
        JPopupMenu pop = new JPopupMenu();
     
        DefaultCaret dcaret = (DefaultCaret) textfeld.getCaret();
     
        public TextFieldExtended() {
     
            list.setFocusable(false);
            scroll.getVerticalScrollBar().setFocusable(false);
            scroll.getHorizontalScrollBar().setFocusable(false);
     
            scroll.setBorder(null);
            pop.add(scroll);
     
            add(textfeld);
     
            setLocationByPlatform(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            setVisible(true);
     
            textfeld.addKeyListener(this);
            pop.addKeyListener(this);
     
            list.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        textfeld.setText(list.getSelectedValue().toString());
                        pop.setVisible(false);
                        textfeld.requestFocus();
                    } else
                        textfeld.setText(list.getSelectedValue().toString());
                }
            });
        }
     
        public static void main(String[] args) {
            new TextFieldExtended();
        }
     
        public void keyTyped(KeyEvent e) {
     
        }
     
        public void keyPressed(KeyEvent e) {
        }
     
        public void keyReleased(KeyEvent e) {
            switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN:
                list.setSelectedIndex(list.getSelectedIndex() + 1);
                break;
            case KeyEvent.VK_UP:
                list.setSelectedIndex(list.getSelectedIndex() - 1);
                break;
            case KeyEvent.VK_ENTER:
                if (pop.isShowing())
                    textfeld.setText(list.getSelectedValue().toString());
                break;
            default: {
                int index = -1;
                if (!textfeld.getText().equals(""))
                    index = list.getNextMatch(textfeld.getText(), 1,
                            Position.Bias.Forward);
     
                if (index != -1) {
                    list.setSelectedIndex(index);
                    pop.setLocation((int) textfeld.getLocationOnScreen().getX()
                            + dcaret.x, (int) textfeld.getLocationOnScreen().getY()
                            + textfeld.getHeight());
                    pop.show(textfeld, dcaret.x, textfeld.getY()
                            + textfeld.getHeight());
                } else
                    pop.setVisible(false);
                textfeld.requestFocus();
     
            }
            }
            if (list.getSelectedValue() != null
                    && list.getSelectedValue().equals(textfeld.getText()))
                pop.setVisible(false);
        }
    }


    Vg Erdal
     

  12. #12
    p3lotud0 p3lotud0 ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    Hallo,

    der Thread ist zwar schon ein bißchen älter, aber er verliert dadurch ja nicht an Aktualität.
    Habe den Code ein bißchen abgeändert, damit ich gleich richtige Textfelder habe, um sie in ein JFrame oder ähnliches einfach hinfügen und dabei halt die Vorschlagsliste übergeben kann. Mein Problem ist jetzt, dass ich einfach die Koordination, also die Position des PopupMenüs richtig setzen kann. Die x-Koordinate erscheint mir korrekt, aber die y-Koordinate ist falsch. Gezeigt wird es immer sehr weit unter dem entsprechenden Textfeld.
    Woran liegt das bzw. wie muss ich das genau abwandeln?
    Denke mal, dass ich damit Schwierigkeiten bekomme, dass ich im Frame, wo die Textfelder erstellt und hinzugefügt werden mit einem GridBagLayout arbeite!?
    Wie kann ich das gescheit lösen?

    Vielen Dank im Voraus

    Der abgewandelte Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
     
    public class TextFieldExtended extends JTextField implements KeyListener {
     
        String[] items;
        JList list;
     
        JScrollPane scroll;
     
        JPopupMenu pop = new JPopupMenu();
        JTextField textfeld = new JTextField();
        DefaultCaret dcaret;
     
        public TextFieldExtended(String[] test) {
     
            textfeld = this;
            dcaret = (DefaultCaret) textfeld.getCaret();
            items = test;
            list =  new JList(items);
            scroll = new JScrollPane(list);
            
            list.setFocusable(false);
            scroll.getVerticalScrollBar().setFocusable(false);
            scroll.getHorizontalScrollBar().setFocusable(false);
     
            scroll.setBorder(null);
            pop.add(scroll);
     
            textfeld.setVisible(true);
            textfeld.addKeyListener(this);
            pop.addKeyListener(this);
        }
     
        public void keyTyped(KeyEvent e) {
     
        }
     
        public void keyPressed(KeyEvent e) {
        }
     
        public void keyReleased(KeyEvent e) {
            switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN:
                list.setSelectedIndex(list.getSelectedIndex() + 1);
                break;
            case KeyEvent.VK_UP:
                list.setSelectedIndex(list.getSelectedIndex() - 1);
                break;
            case KeyEvent.VK_ENTER:
                if (pop.isShowing())
                    textfeld.setText(list.getSelectedValue().toString());
                break;
            default: {
                int index = -1;
                if (!textfeld.getText().equals(""))
                    index = list.getNextMatch(textfeld.getText(), 1,
                            Position.Bias.Forward);
     
                if (index != -1) {
                    list.setSelectedIndex(index);
                    pop.setLocation((int) textfeld.getLocationOnScreen().getX()
                            + dcaret.x, (int) textfeld.getLocationOnScreen().getY()
                            + textfeld.getHeight());
                    pop.show(textfeld, dcaret.x, textfeld.getY()+ textfeld.getHeight());
                } else
                    pop.setVisible(false);
                textfeld.requestFocus();
            }
            }
            if (list.getSelectedValue() != null
                    && list.getSelectedValue().equals(getText()))
                pop.setVisible(false);
        }
    }

    Oder den ursprünglichen Code lassen und ein JFrame in ein JFrame einbinden, aber damit bekomme ich Probleme. Geht das überhaupt!?
    Geändert von p3lotud0 (05.04.07 um 22:45 Uhr)
     

  13. #13
    MichaPl MichaPl ist offline Grünschnabel
    Registriert seit
    May 2007
    Beiträge
    1
    Ich hab mal ein paar Sachen geändert und die Position nicht mehr berechnet. Funktioniert dies bei Dir?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import javax.swing.JList;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.ListModel;
    import javax.swing.text.Position;
     
     
    public class TextFieldExtended extends JTextField implements KeyListener {
     
      JList list = new JList();
      JPopupMenu pop = new JPopupMenu();
     
      public TextFieldExtended() {
     
        JScrollPane scroll = new JScrollPane(list);
        list.setFocusable(false);
        scroll.getVerticalScrollBar().setFocusable(false);
        scroll.getHorizontalScrollBar().setFocusable(false);
     
        scroll.setBorder(null);
        pop.add(scroll);
     
        this.setVisible(true);
        this.addKeyListener(this);
        pop.addKeyListener(this);
      }
     
      /**
       *
       * Methode: keyTyped
       * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
       * 24.05.2007
       *
       * @param e
       */
      public void keyTyped(KeyEvent e) {
     
      }
     
      /**
       *
       * Methode: keyPressed
       * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
       * 24.05.2007
       *
       * @param e
       */
      public void keyPressed(KeyEvent e) {
      }
     
      /**
       *
       * Methode: keyReleased
       * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
       * 24.05.2007
       *
       * @param e
       */
      public void keyReleased(KeyEvent e) {
        switch (e.getKeyCode()) {
          case KeyEvent.VK_DOWN:
            list.setSelectedIndex(list.getSelectedIndex() + 1);
            break;
          case KeyEvent.VK_UP:
            list.setSelectedIndex(list.getSelectedIndex() - 1);
            break;
          case KeyEvent.VK_ENTER:
            if (pop.isShowing()) {
              this.setText(list.getSelectedValue().toString());
            }
            break;
          default: {
            int index = -1;
            if (!"".equals(getText()) && list.getModel().getSize() > 0) {
              index = list.getNextMatch(getText(), 0, Position.Bias.Forward);
            }
     
            if (index != -1) {
              list.setSelectedIndex(index);
              pop.show(this, 0, getHeight());
            }
            else {
              pop.setVisible(false);
            }
            requestFocus();
          }
        }
        if (list.getSelectedValue() != null && list.getSelectedValue().equals(getText())) {
          pop.setVisible(false);
        }
      }
     
      /**
       * @return the items
       */
      public ListModel getItems() {
        return list.getModel();
      }
     
      /**
       * @param items the items to set
       */
      public void setItems(ListModel items) {
        list.setModel(items);
      }
     
    }
     

  14. #14
    offtake offtake ist offline Grünschnabel
    Registriert seit
    Aug 2007
    Beiträge
    2
    Hi, super Vorarbeit, ich habe die Klasse mal etwas erweitert...

    Die Position des Popups stimmt jetzt und zudem wird nach einem Leerzeichene ein neue Erkennung gestartet.. Ich brauche den Code für eine Eclipse-ähnliche Editorfunktion. Da gibt es ja auch diese Popoupmenüs zur Autovervollständigung..

    Ein Problem habe ich aber noch und zwar kann ich mit den Pfeiltasten das Scollpane nicht dazu bringen, automatisch zuscrollen, wenn ich das Ende des SICHTBAREN Liste erreicht habe.. Hat einer eine Idee?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    
    package combobox;
     
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import javax.swing.JList;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.ListModel;
    import javax.swing.text.Position;
     
    public class TextFieldExtended2 extends JTextField implements KeyListener {
     
        JList list = new JList();
        JPopupMenu pop = new JPopupMenu();
        JScrollPane scroll;
     
        public TextFieldExtended2( String[] items) {
            
            list = new JList(items);
     
            scroll = new JScrollPane(list);
            list.setFocusable(false);
            scroll.getVerticalScrollBar().setFocusable(false);
            scroll.getHorizontalScrollBar().setFocusable(false);
            scroll.setBorder(null);
     
            pop.add(scroll);
     
            this.setVisible(true);
            this.addKeyListener(this);
            pop.addKeyListener(this);
        }
     
        /**
         *
         * Methode: keyTyped
         * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
         * 24.05.2007
         *
         * @param e
         */
        public void keyTyped(KeyEvent e) {
     
        }
     
        /**
         *
         * Methode: keyPressed
         * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
         * 24.05.2007
         *
         * @param e
         */
        public void keyPressed(KeyEvent e) {
        }
     
        /**
         *
         * Methode: keyReleased
         * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
         * 24.05.2007
         *
         * @param e
         */
        public void keyReleased(KeyEvent e) {
            switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN:
                list.setSelectedIndex(list.getSelectedIndex() + 1);
                break;
            case KeyEvent.VK_UP:
                list.setSelectedIndex(list.getSelectedIndex() - 1);
                break;
            case KeyEvent.VK_ENTER:
                if (pop.isShowing()) {
                    this.setText(getLastSentence() + list.getSelectedValue().toString());
                }
                break;
            default: {
                int index = -1;
                if (!"".equals(getText()) && list.getModel().getSize() > 0) {
                    index = list.getNextMatch(getLastWord(), 0, Position.Bias.Forward);
                }
     
                if (index != -1) {
                    list.setSelectedIndex(index);
                    int y = (int)getCaret().getMagicCaretPosition().getY() + 15;
                    int x = (int)getCaret().getMagicCaretPosition().getX();
                    pop.show(this, x, y);
                }
                else {
                    pop.setVisible(false);
                }
                requestFocus();
            }
            }
            if (list.getSelectedValue() != null && list.getSelectedValue().equals(getLastWord())) {
                pop.setVisible(false);
            }
        }
        
        private String getLastSentence(){
            String result="";
            String text = getText();
            if(!text.equals("")){
                int index = text.lastIndexOf(getLastWord());
                result = text.substring(0,index);
            }
            return result;
        }
        
        private String getLastWord(){
            String result="";
            String text = getText();
            if(!text.equals("")){
                String[] textes = text.split(" ");
                result = textes[textes.length-1];
            }
            
            return result;
        }
     
        /**
         * @return the items
         */
        public ListModel getItems() {
            return list.getModel();
        }
     
        /**
         * @param items the items to set
         */
        public void setItems(ListModel items) {
            list.setModel(items);
        }
     
     
    }

    Viele Grüße,
    offtake
     

  15. #15
    offtake offtake ist offline Grünschnabel
    Registriert seit
    Aug 2007
    Beiträge
    2
    Ich habe einen Workaround gefunden, jedoch ist der recht dirty...

    Code :
    1
    2
    3
    4
    5
    6
    
            case KeyEvent.VK_DOWN:
                list.setSelectedIndex(list.getSelectedIndex() + 1);
                JViewport view = scroll.getViewport();
                Point p = new Point(view.getX(),list.getSelectedIndex()*2);
                view.setViewPosition(p);
                break;

    Habt ihr ne Idee wie ich das anders mache, ich will ja auf keinen Fall als dem Index ne Pixelzahl errechnen, wer weiß auf welchem Rechner das klappt und wo nciht...

    Mit dem Fokuskram haut das auch keinen Fall hin, weil es dann wieder Probleme mit der Abfrage der Entertaste gibt...

    vg, offtake
     

Ähnliche Themen

  1. JPopupMenu auf JTabbedPane
    Von zer0 im Forum Java
    Antworten: 2
    Letzter Beitrag: 06.08.10, 13:14
  2. JList mit JPopupMenu
    Von _streissi im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 7
    Letzter Beitrag: 26.05.09, 15:42
  3. JPopupMenu und Vorauswahl
    Von Rhax im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 15.11.07, 14:58
  4. jPopupmenu oder änliches
    Von Edelfalke im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 23.07.07, 11:19
  5. JTabbedPane und JPopupMenu
    Von Wyatt im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 19.06.07, 13:27