tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Artorius
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
840
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    THEJS THEJS ist offline Mitglied Silber
    Registriert seit
    Aug 2007
    Ort
    Sandl (Oberösterreich)
    Beiträge
    93
    Hi!

    Ich hätte wieder mal eine Frage bezüglich JTable und CellEditor.

    Ich hab mit einen CellEditor geschrieben - das ganze heißt ArticleSelectionEditor und besteht aus einem Textfeld und einem Button:
    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
    
    public class ArticleSelectionEditor extends AbstractCellEditor implements TableCellEditor {
     
        private static final long serialVersionUID = 1L;
        
        String originalValue;
        
        JButton btnMore = new JButton();
        JTextField txtField = new JTextField();
        JComponent component = new JPanel();
        
        public ArticleSelectionEditor() {
            
            btnMore.setText("...");
            btnMore.setPreferredSize(new Dimension(20, 8));
            btnMore.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    ArticleSelectionDialog dlg = new ArticleSelectionDialog("Wählen Sie einen Artikel aus der Liste");
                    int result = dlg.showDialog();
                    if(result > 0)
                    {
                        txtField.setText(dlg.getArtikelnr());
                    }
                }
            });
            
            txtField.requestFocus();
            
            component.setLayout(new BorderLayout());
            component.add(txtField, BorderLayout.CENTER);
            component.add(btnMore, BorderLayout.EAST);
            component.addFocusListener(new FocusAdapter() {
                @Override
                public void focusGained(FocusEvent arg0) {
                    txtField.setText(originalValue);
                    txtField.requestFocusInWindow();
                    txtField.selectAll();
                }
            });
            
        }
     
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            originalValue = value.toString();
            txtField.setText(originalValue);
            component.requestFocus();
            return component;
        }
     
        @Override
        public Object getCellEditorValue() {
            try
            {
                if(DBConnection.executeQuery("SELECT productid FROM product WHERE productnr = '" + txtField.getText() + "'").next())
                {
                    return txtField.getText();
                } else
                {
                    JOptionPane.showMessageDialog(null, "Eingegebene Artikelnummer existiert nicht in der Datenbank!", "Falsche Eingabe", JOptionPane.ERROR_MESSAGE);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return originalValue;
        }

    Mein CellEditor soll nun, wenn man diesen aktiviert (öffnet - wie sagt man da?), den Text im TextFeld markieren.
    Das Funktioniert an und für sich schon recht gut, nur funktionierts nicht, wenn man mit dem Fokus auf der Zelle ist und man einen Buchstaben oder eine Zahl eingibt.

    Ich habe das Problem schon einmal gehabt, einen Thread aufgemacht und habs dann auch lösen können, nur steh ich jetzt wieder an, wenn es um ein Panel als Editor geht.

    Danke für eure Hilfe

    greez
    THEJS
     

  2. #2
    Avatar von Artorius
    Artorius Artorius ist offline Mitglied Plutonium
    Registriert seit
    Feb 2010
    Beiträge
    222
    Hi,
    wenn ich dich richtig verstehe, müsstest du statt dem Panel dem FocusListener zuzuweisen
    Zitat Zitat von THEJS Beitrag anzeigen
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    
        component.addFocusListener(new FocusAdapter() {
                @Override
                public void focusGained(FocusEvent arg0) {
                    txtField.setText(originalValue);
                    txtField.requestFocusInWindow();
                    txtField.selectAll();
                }
            });
    einfach nur dem TextField dem Listener zuweisen
    Code java:
    1
    2
    3
    4
    5
    6
    
        textField.addFocusListener(new FocusAdapter() {
                @Override
                public void focusGained(FocusEvent arg0) {
                    txtField.selectAll();
                }
            });
    Dabei sollte es m.E. auch nicht nötig sein, nochmal den Text zu setzen...

    Grüße!
     

  3. #3
    THEJS THEJS ist offline Mitglied Silber
    Registriert seit
    Aug 2007
    Ort
    Sandl (Oberösterreich)
    Beiträge
    93
    Danke für deine schnelle Antwort Artorius!

    Aber, mein Problem ist, dass der Fokus auf dem Panel liegt (nehm ich jetzt mal an) der FocusListener aber garnicht angesprochen wird.
    (Was wir ja schon mal hatten )

    Kann das sein, dass das ein BUG von Java ist? bzw. halt vom JTable oder Model?

    greez
     

  4. #4
    Avatar von Artorius
    Artorius Artorius ist offline Mitglied Plutonium
    Registriert seit
    Feb 2010
    Beiträge
    222
    Ah, jetzt hats auch wieder geklingelt...
    Das müsst es doch sein, oder?
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    
     
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusAdapter;
    import java.awt.event.FocusEvent;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellEditor;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    /*
     * TestFrame.java
     *
     * Created on 25.03.2010, 15:23:37
     */
     
    /**
     *
     * @author jw
     */
    public class TestFrame extends javax.swing.JFrame {
     
        /** Creates new form TestFrame */
        public TestFrame() {
            initComponents();
            jTable1.getColumnModel().getColumn(0).setCellEditor(new TestEditor());
            jTable1.addKeyListener(new KeyListener(){
     
                public void keyTyped(KeyEvent ke) {
                  
                }
     
                public void keyPressed(KeyEvent ke) {
                  
                }
     
                public void keyReleased(KeyEvent ke) {
                   ((TestEditor)(jTable1.getCellEditor(0,0 ))).txtField.selectAll();
                    ((TestEditor)(jTable1.getCellEditor(0,0 ))).txtField.requestFocus();
                    ((TestEditor)(jTable1.getCellEditor(0,0 ))).txtField.setText(""+ke.getKeyChar());
                   ke.consume();
                }
     
            });
     
        }
       
        public class TestEditor extends AbstractCellEditor implements TableCellEditor {
     
        private static final long serialVersionUID = 1L;
     
        String originalValue;
     
        JButton btnMore = new JButton();
        JTextField txtField = new JTextField();
        JComponent component = new JPanel();
     
       
     
        public TestEditor() {
     
            btnMore.setText("...");
            btnMore.setPreferredSize(new Dimension(20, 8));
            btnMore.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    /*ArticleSelectionDialog dlg = new ArticleSelectionDialog("Wählen Sie einen Artikel aus der Liste");
                    int result = dlg.showDialog();
                    if(result > 0)
                    {
                        txtField.setText(dlg.getArtikelnr());
                    }*/
                }
            });
     
            txtField.requestFocus();
     
            component.setLayout(new BorderLayout());
            component.add(txtField, BorderLayout.CENTER);
            component.add(btnMore, BorderLayout.EAST);
            txtField.addMouseListener(new MouseAdapter(){
                    @Override
                public void mouseReleased(MouseEvent e){
                    txtField.selectAll();
                }
            });
     
        }
     
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            originalValue = value.toString();
            txtField.setText(originalValue);
            
            return component;
        }
     
        @Override
        public Object getCellEditorValue() {
                 return txtField.getText();
     
     
        }
    }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            jScrollPane1 = new javax.swing.JScrollPane();
            jTable1 = new javax.swing.JTable();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     
            jTable1.setModel(new javax.swing.table.DefaultTableModel(
                new Object [][] {
                    {"123", null, null, null},
                    {"12344", null, null, null},
                    {"123123123", null, null, null},
                    {null, null, null, null}
                },
                new String [] {
                    "Title 1", "Title 2", "Title 3", "Title 4"
                }
            ));
            jScrollPane1.setViewportView(jTable1);
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap(15, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(25, Short.MAX_VALUE))
            );
     
            pack();
        }// </editor-fold>
     
        /**
        * @param args the command line arguments
        */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new TestFrame().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTable jTable1;
        // End of variables declaration
     
    }
    THEJS bedankt sich. 

  5. #5
    THEJS THEJS ist offline Mitglied Silber
    Registriert seit
    Aug 2007
    Ort
    Sandl (Oberösterreich)
    Beiträge
    93
    Yeah!

    Mein Held *verneigung*


    greez THEJS
     

Ähnliche Themen

  1. JFormattedTextField in einem Celleditor
    Von ElJarno im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 06.05.10, 17:26
  2. Probleme mit CellEditor
    Von TMDolphin im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 18.01.09, 09:17
  3. Problem mit eigenem CellEditor
    Von TimoTH im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 11.07.07, 08:19
  4. CellEditor
    Von darksmilie im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 29.08.06, 16:22
  5. JTable CellEditor editingCanceled
    Von nils_eckert im Forum Java
    Antworten: 0
    Letzter Beitrag: 30.01.05, 20:08