如何修改JTextArea中Tab键的行为?

如何修改JTextArea中Tab键的行为?,第1张

如何修改JTextArea中Tab键的行为?
import java.awt.*;import java.util.*;import java.awt.event.*;import javax.swing.*;public class textareaTab extends Jframe{    public textareaTab()    {        Container contentPane = getContentPane();        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));        contentPane.add( nullTraversalKeys() );        contentPane.add( writeYourOwnAction() );        contentPane.add( useKeyListener() );        contentPane.add( addTraversalKeys() );    }    //  Reset the text area to use the default tab keys.    //  This is probably the best solution.    private JComponent nullTraversalKeys()    {        Jtextarea textarea = new Jtextarea(3, 30);        textarea.setText("Null Traversal Keysn2n3n4n5n6n7n8n9");        JScrollPane scrollPane = new JScrollPane( textarea );//        scrollPane.getVerticalScrollBar().setFocusable(false);        textarea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);        textarea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);        return scrollPane;    }    //  Replace the Tab Actions. A little more complicated but this is the    //  only solution that will place focus on the component, not the    //  vertical scroll bar, when tabbing backwards (unless of course you    //  have manually prevented the scroll bar from getting focus).    private JComponent writeYourOwnAction()    {        Jtextarea textarea = new Jtextarea(3, 30);        textarea.setText("Write Your Own Tab Actionsn2n3n4n5n6n7n8n9");        JScrollPane scrollPane = new JScrollPane( textarea );        InputMap im = textarea.getInputMap();        KeyStroke tab = KeyStroke.getKeyStroke("TAB");        textarea.getActionMap().put(im.get(tab), new TabAction(true));        KeyStroke shiftTab = KeyStroke.getKeyStroke("shift TAB");        im.put(shiftTab, shiftTab);        textarea.getActionMap().put(im.get(shiftTab), new TabAction(false));        return scrollPane;    }    //  Use a KeyListener    private JComponent useKeyListener()    {        Jtextarea textarea = new Jtextarea(3, 30);        textarea.setText("Use Key Listenern2n3n4n5n6n7n8n9");        JScrollPane scrollPane = new JScrollPane( textarea );        scrollPane.getVerticalScrollBar().setFocusable(false);        textarea.addKeyListener(new KeyAdapter()        { public void keyPressed(KeyEvent e) {     if (e.getKeyCode() == KeyEvent.VK_TAB)     {         e.consume();         KeyboardFocusManager.  getCurrentKeyboardFocusManager().focusNextComponent();     }     if (e.getKeyCode() == KeyEvent.VK_TAB     &&  e.isShiftDown())     {         e.consume();         KeyboardFocusManager.  getCurrentKeyboardFocusManager().focusPreviousComponent();     } }        });        return scrollPane;    }    //  Add Tab and Shift-Tab KeyStrokes back as focus traversal keys.    //  Seems more complicated then just using null, but at least    //  it shows how to add a KeyStroke as a focus traversal key.    private JComponent addTraversalKeys()    {        Jtextarea textarea = new Jtextarea(3, 30);        textarea.setText("Add Traversal Keysn2n3n4n5n6n7n8n9");        JScrollPane scrollPane = new JScrollPane( textarea );        scrollPane.getVerticalScrollBar().setFocusable(false);        Set set = new HashSet( textarea.getFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS ) );        set.add( KeyStroke.getKeyStroke( "TAB" ) );        textarea.setFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, set );        set = new HashSet( textarea.getFocusTraversalKeys( KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS ) );        set.add( KeyStroke.getKeyStroke( "shift TAB" ) );        textarea.setFocusTraversalKeys( KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, set );        return scrollPane;    }    class TabAction extends AbstractAction    {        private boolean forward;        public TabAction(boolean forward)        { this.forward = forward;        }        public void actionPerformed(ActionEvent e)        { if (forward)     tabForward(); else     tabBackward();        }        private void tabForward()        { final KeyboardFocusManager manager =     KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.focusNextComponent(); SwingUtilities.invokeLater(new Runnable() {     public void run()     {         if (manager.getFocusOwner() instanceof JScrollBar)  manager.focusNextComponent();     } });        }        private void tabBackward()        { final KeyboardFocusManager manager =     KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.focusPreviousComponent(); SwingUtilities.invokeLater(new Runnable() {     public void run()     {         if (manager.getFocusOwner() instanceof JScrollBar)  manager.focusPreviousComponent();     } });        }    }    public static void main(String[] args)    {        textareaTab frame = new textareaTab();        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );        frame.pack();        frame.setLocationRelativeTo(null);        frame.setVisible(true);    }}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5487091.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存