如何为JTextPane应用键盘Ins操作

时间:2014-08-14 09:49:19

标签: java swing keyboard keylistener

我想为JTextPane应用插入操作(键盘有Ins)。当我点击" Ins"(它在键盘中显示为" Ins")并输入一些字符键盘它已经用键入的字符替换了textpane光标位置字符,直到再次" Ins"被迫。我想实现这个任务。提供一些解决方案。

示例代码:

public class InsertDemo extends javax.swing.JFrame {
JScrollPane scrollPane;
int i=0;
JTextPane textPane;
private static boolean isOvertypeMode;
private Caret defaultCaret;
private Caret overtypeCaret;
public InsertDemo() {
    initComponents();
      textPane=new JTextPane();
      textPane.setCaretColor( Color.red );
      defaultCaret = textPane.getCaret();
      overtypeCaret = new OvertypeCaret();
      overtypeCaret.setBlinkRate( defaultCaret.getBlinkRate() );
      setOvertypeMode( false );
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    tabbedPane = new javax.swing.JTabbedPane();
    jMenuBar1 = new javax.swing.JMenuBar();
    file = new javax.swing.JMenu();
    newFile = new javax.swing.JMenuItem();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    file.setText("File");

    newFile.setText("NewFile");
    newFile.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            newFileActionPerformed(evt);
        }
    });
    file.add(newFile);

    jMenuBar1.add(file);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 279, Short.MAX_VALUE)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void newFileActionPerformed(java.awt.event.ActionEvent evt) {                                        
    final JInternalFrame internalFrame = new JInternalFrame("");
    i++;
    internalFrame.setName("Doc "+i);
    internalFrame.setClosable(true);
    internalFrame.setAutoscrolls(true);
    scrollPane=new JScrollPane(textPane);
    internalFrame.add(textPane);
    tabbedPane.add(internalFrame);
    internalFrame.setSize(internalFrame.getMaximumSize());
    internalFrame.pack();
    internalFrame.setVisible(true);
}                                       
public static void main(String args[]) {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(InsertDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(InsertDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(InsertDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(InsertDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new InsertDemo().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JMenu file;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem newFile;
private javax.swing.JTabbedPane tabbedPane;
// End of variables declaration                   

public boolean isOvertypeMode()
 {
      return isOvertypeMode;
 }
 public void setOvertypeMode(boolean isOvertypeMode)
 {
      this.isOvertypeMode = isOvertypeMode;
      int pos = textPane.getCaretPosition();
      if ( isOvertypeMode() )
      {
           textPane.setCaret( overtypeCaret );
      }
      else
      {
           textPane.setCaret( defaultCaret );
      }
      textPane.setCaretPosition( pos );
 }
 public void replaceSelection(String text)
 {
      if ( isOvertypeMode() )
      {
           int pos = textPane.getCaretPosition();
           if (textPane.getSelectedText() == null
           &&  pos < textPane.getDocument().getLength())
           {
                textPane.moveCaretPosition( pos + 1);
           }
      }
      textPane.replaceSelection(text);
 }
 protected void processKeyEvent(KeyEvent e)
 {
      super.processKeyEvent(e);
       if (e.getID() == KeyEvent.KEY_RELEASED
       &&  e.getKeyCode() == KeyEvent.VK_INSERT)
       {
           setOvertypeMode( ! isOvertypeMode() );
       }
 }    
class OvertypeCaret extends DefaultCaret {
      public void paint(Graphics g)
      {
           if (isVisible())
           {
                try
                {
                     JTextComponent component = getComponent();
                     TextUI mapper = component.getUI();
                     Rectangle r = mapper.modelToView(component, getDot());
                     g.setColor(component.getCaretColor());
                     int width = g.getFontMetrics().charWidth( 'w' );
                     int y = r.y + r.height - 2;
                     g.drawLine(r.x, y, r.x + width - 2, y);
                }
                catch (BadLocationException e) {}
           }
      }
      protected synchronized void damage(Rectangle r)
      {
           if (r != null)
           {
                JTextComponent component = getComponent();
                x = r.x;
                y = r.y;
                width = component.getFontMetrics( component.getFont() ).charWidth( 'w' );
                height = r.height;
                repaint();
           }
      }
 }

}

0 个答案:

没有答案