2012-04-17 88 views
0

我想突出显示JTextArea中的一个特定行,但我不知道如何解决这个问题。我需要获取特定的行然后突出显示它。我已阅读其他帖子,但我仍然不明白如何将它集中在一起解决我的问题......帮助将不胜感激。在JTextArea中突出显示一个特定的行/行

+3

如果您尝试过这个美妙的POST,[如何通过@mKorbel强调](http://stackoverflow.com/questions/9650992/how-to-change-text-color-in-the-jtextarea/9651404#9651404 ) – 2012-04-17 13:01:11

+2

-1没有研究这个。在谷歌上弹出的第一件事是一个有效的代码片段。 – 2012-04-17 13:01:44

+0

我尝试过那些,但他们并没有解决我突出显示特定行的问题,我试图获得特定的行并将其突出显示 – 2012-04-17 13:15:50

回答

11

尝试在此代码示例你的手,不要问,如果事情是不明确:

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

public class TextHighlight 
{ 
    private JTextArea tarea; 
    private JComboBox cbox; 
    private JTextField lineField; 
    private String[] colourNames = {"RED", "ORANGE", "CYAN"}; 

    private Highlighter.HighlightPainter painter; 

    private void createAndDisplayGUI() 
    { 
     final JFrame frame = new JFrame("Text HIGHLIGHT"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setBorder(BorderFactory.createTitledBorder(
       BorderFactory.createEmptyBorder(5, 5, 5, 5), "Highlighter JTextArea")); 

     tarea = new JTextArea(10, 10); 
     JScrollPane scrollPane = new JScrollPane(tarea); 
     contentPane.add(scrollPane); 

     JButton button = new JButton("HIGHLIGHT TEXT"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       int selection = JOptionPane.showConfirmDialog(
         frame, getOptionPanel(), "Highlighting Options : ", JOptionPane.OK_CANCEL_OPTION 
               , JOptionPane.PLAIN_MESSAGE); 
       if (selection == JOptionPane.OK_OPTION)        
       { 
        System.out.println("OK Selected"); 
        int lineNumber = Integer.parseInt(lineField.getText().trim()); 
        try 
        { 
         int startIndex = tarea.getLineStartOffset(lineNumber); 
         int endIndex = tarea.getLineEndOffset(lineNumber); 
         String colour = (String) cbox.getSelectedItem(); 

         if (colour == colourNames[0]) 
         { 
          System.out.println("RED Colour"); 
          painter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED); 
          tarea.getHighlighter().addHighlight(startIndex, endIndex, painter); 
         } 
         else if (colour == colourNames[1]) 
         { 
          System.out.println("ORANGE Colour"); 
          painter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE); 
          tarea.getHighlighter().addHighlight(startIndex, endIndex, painter); 
         } 
         else if (colour == colourNames[2]) 
         { 
          System.out.println("CYAN Colour"); 
          painter = new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN); 
          tarea.getHighlighter().addHighlight(startIndex, endIndex, painter); 
         } 
        } 
        catch(BadLocationException ble) 
        { 
         ble.printStackTrace(); 
        } 
       } 
       else if (selection == JOptionPane.CANCEL_OPTION) 
       { 
        System.out.println("CANCEL Selected"); 
       } 
       else if (selection == JOptionPane.CLOSED_OPTION) 
       { 
        System.out.println("JOptionPane closed deliberately."); 
       } 
      } 
     }); 

     frame.add(contentPane, BorderLayout.CENTER); 
     frame.add(button, BorderLayout.PAGE_END); 

     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private JPanel getOptionPanel() 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, 2, 5, 5)); 

     JLabel lineNumberLabel = new JLabel("Enter Line Number : "); 
     lineField = new JTextField(10); 

     JLabel colourLabel = new JLabel("Select One Colour : "); 
     cbox = new JComboBox(colourNames); 

     panel.add(lineNumberLabel); 
     panel.add(lineField); 
     panel.add(colourLabel); 
     panel.add(cbox); 

     return panel; 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextHighlight().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

这里是它的输出:

HIGHLIGHTER EXAMPLE

+1

感谢您的示例代码,这是我所做的。 'code RectanglePainter red = new RectanglePainter(Color.RED); 尝试{ f1.textarea.getHighlighter()addHighlight(f1.textarea.getLineStartOffset(ILINE),f1.textarea.getLineEndOffset(ILINE),红色); //} 赶上(BadLocationException的前){ ex.printStackTrace( ); } ' – 2012-04-17 15:00:32

3

如果无法选择TextArea到TextField的原因是按钮点击导致JTextArea失去焦点,因此不显示它的选择。 按钮单击事件使用btnImport.transferFocusBackward();来解决问题。