2014-06-03 3 views
1

Есть ли способ изменить мигающую каретку в текстовом поле другому персонажу? Я хотел бы изменить его с "|" на ">". Все, что я знаю, как изменить цвет.Как изменить каретку в текстовом поле?

textField.setCaretColor(Color.WHITE); 

благодаря

+1

См. [Related] (http://stackoverflow.com/questions/1031 8728/с использованием-заказ каретка-в-JTextField-для-доступности). –

+1

Вам необходимо реализовать свою собственную [Caret] (http://docs.oracle.com/javase/7/docs/api/javax/swing/text/Caret.html) и использовать [JTextField # setCaret] (http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#setCaret(javax.swing.text.Caret)) применить его – MadProgrammer

ответ

2

В принципе, вам нужно создать собственный Caret и краски, что вы хотите ...

Caret

import java.awt.EventQueue; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.GridBagLayout; 
import java.awt.Rectangle; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.plaf.TextUI; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultCaret; 
import javax.swing.text.Document; 
import javax.swing.text.Element; 
import javax.swing.text.JTextComponent; 
import javax.swing.text.Position; 

public class CaretExample { 

    public static void main(String[] args) { 
     new CaretExample(); 
    } 

    public CaretExample() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JTextField field = new JTextField(10); 
       field.setCaret(new MyCaret()); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       frame.add(field); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MyCaret extends DefaultCaret { 

     private String mark = "<"; 

     public MyCaret() { 
      setBlinkRate(500); 
     } 

     @Override 
     protected synchronized void damage(Rectangle r) { 
      if (r == null) { 
       return; 
      } 

      JTextComponent comp = getComponent(); 
      FontMetrics fm = comp.getFontMetrics(comp.getFont()); 
      int textWidth = fm.stringWidth(">"); 
      int textHeight = fm.getHeight(); 
      x = r.x; 
      y = r.y; 
      width = textWidth; 
      height = textHeight; 
      repaint(); // calls getComponent().repaint(x, y, width, height) 
     } 

     @Override 
     public void paint(Graphics g) { 
      JTextComponent comp = getComponent(); 
      if (comp == null) { 
       return; 
      } 

      int dot = getDot(); 
      Rectangle r = null; 
      try { 
       r = comp.modelToView(dot); 
      } catch (BadLocationException e) { 
       return; 
      } 
      if (r == null) { 
       return; 
      } 

      if ((x != r.x) || (y != r.y)) { 
       repaint(); // erase previous location of caret 
       damage(r); 
      } 

      if (isVisible()) { 
       FontMetrics fm = comp.getFontMetrics(comp.getFont()); 
       int textWidth = fm.stringWidth(">"); 
       int textHeight = fm.getHeight(); 

       g.setColor(comp.getCaretColor()); 
       g.drawString(mark, x, y + fm.getAscent()); 
      } 
     } 

    } 
} 

Это основано на этом example

+0

спасибо @MadProgrammer, но если мы хотим, чтобы символ DOS «Мигает, возможно ли это? Что это за персонаж? – gumuruh

+0

Вы пробовали '|'? Некоторое время назад я обратил внимание на приглашение dos или (на основе вопроса) '>'? – MadProgrammer

Смежные вопросы