JTable trükkök

    Pár hasznos trükk, ha JTable osztályt használsz: nem kívánt viselkedések megszűntetése, javítása.

    Táblázatszerkesztés leállítása ha a felhasználó egy másik komponensre kattint

    Megoldás:

    JTable table = new JTable();
    ...
    table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);  

    Táblázatcella-szerkesző megfelelő fókuszálása, ha a felhasználó a szerkeszthető cellára kattint

    Saját szerkesztő komponens használata esetén, amely megvalósítja a TableCellEditor interface-t, a következő kód segít az automatikus fókuszálsban:

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
       ...
       final Component c;
       ...
       SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    if (c instanceof JComboBox) {
                        ((JComboBox) c).getEditor().getEditorComponent().requestFocusInWindow();
                    } else if (c instanceof JSpinner) {
                        ((JSpinner.DefaultEditor)((JSpinner) c).getEditor()).getTextField().requestFocusInWindow();
                    } else{
                        c.requestFocusInWindow();
                    }
                }
        });
       return c;
    }

    Az ENTER kellemetlen hatásának megszűntetése

    A JTable egyik sokak által kifogásolt viselkedése, hogy ENTER hatására a fókusz egy cellával lejjebb kerül.

    JTable table = new JTable();
    ...
    String doNothing = "doNothing";
    KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
    table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(enter, doNothing);
    table.getActionMap().put(doNothing, new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // Do nothing
        }
    });

    Kapcsolódó cikkek

    Tags: ,