2015-11-09 1 views
3

Je souhaite utiliser un JTextArea ou un JTextPane en tant que lecteur de changement de code, et les changements de code et les mouvements du caret sont enregistrés dans un fichier texte. Mais le problème est, il est enregistré à partir d'un éditeur qui prend en charge la sélection multiple, de sorte qu'il y a plus d'un poste d'insertion à la fois.Comment afficher plusieurs carets dans un JTextArea ou un JTextPane

Est-il possible d'afficher plusieurs carets dans JTextArea ou JTextPane? J'ai essayé d'utiliser JTextPane et de rendre le code HTML, et j'ai inséré <span class='caret'>|</span> dans le code pour représenter les carets, cela fonctionne mais le faux caret prend de l'espace, donc les caractères normaux ne sont pas fixés à l'écran quand le caret change.

Répondre

4

Comme cela?

import javax.swing.*; 
import javax.swing.plaf.TextUI; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultCaret; 
import java.awt.*; 
import java.util.Arrays; 
import java.util.List; 

public class Main { 

    public static void main(String[] args) { 
     JFrame fr=new JFrame("Multi caret test"); 
     JTextArea ta=new JTextArea("Test test test", 20, 40); 
     MultiCaret c=new MultiCaret(); 
     c.setBlinkRate(500); 
     c.setAdditionalDots(Arrays.asList(2,4,7)); 
     ta.setCaret(c); 
     fr.add(ta); 

     fr.pack(); 
     fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     fr.setLocationRelativeTo(null); 
     fr.setVisible(true); 
    } 
} 

class MultiCaret extends DefaultCaret { 
    private List<Integer> additionalDots; 

    public void setAdditionalDots(List<Integer> additionalDots) { 
     this.additionalDots = additionalDots; 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 

     try { 
      TextUI mapper = getComponent().getUI(); 
      for (Integer addDot : additionalDots) { 
       Rectangle r = mapper.modelToView(getComponent(), addDot, getDotBias()); 

       if(isVisible()) { 
        g.setColor(getComponent().getCaretColor()); 
        int paintWidth = 1; 
        r.x -= paintWidth >> 1; 
        g.fillRect(r.x, r.y, paintWidth, r.height); 
       } 
       else { 
        getComponent().repaint(r); 
       } 
      } 
     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

C'est vraiment cool! – Freewind

2

un éditeur qui prend en charge la sélection multiple,

Peut-être que vous devriez utiliser un Highlighter pour mettre en évidence plusieurs domaines de la sélection de texte:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class TextAndNewLinesTest extends JFrame 
{ 
    public TextAndNewLinesTest() 
     throws Exception 
    { 
     String text = 
      "one two three four five\r\n" + 
      "one two three four five\r\n" + 
      "one two three four five\r\n" + 
      "one two three four five\r\n" + 
      "one two three four five\r\n"; 

     JTextPane textPane = new JTextPane(); 
     textPane.setText(text); 
     JScrollPane scrollPane = new JScrollPane(textPane); 
     getContentPane().add(scrollPane); 

     Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.cyan); 

     String search = "three"; 
     int offset = 0; 

     int length = textPane.getDocument().getLength(); 
     text = textPane.getDocument().getText(0, length); 

     while ((offset = text.indexOf(search, offset)) != -1) 
     { 
      try 
      { 
       textPane.getHighlighter().addHighlight(offset, offset + 5, painter); // background 
       offset += search.length(); 
      } 
      catch(BadLocationException ble) {} 
     } 
    } 

    public static void main(String[] args) 
     throws Exception 
    { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     JFrame frame = new TextAndNewLinesTest(); 
     frame.setTitle("Text and New Lines - Problem"); 
//  frame.setTitle("Text and New Lines - Fixed"); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setSize(400, 120); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Merci d'avoir montré l'utilisation de surligneur! – Freewind