我想为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();
}
}
}
}