2013-01-05 38 views
3

我该如何去定制Java中的滚动条,这样我就可以有一个像铬一样的搜索,也就是说把彩色条纹放在结果的位置?java彩色滚动条搜索结果

我不想要一个图书馆,因为我宁愿自己编码。另外我不想放松自己的L。例子欢迎。

其实它会查看一个大的文本文件或一个长的jtable,有没有人有任何好的想法,我怎么能有一个高效的滚动条来查看? ...我应该有一个双滚动条一个开始结束和一个内部滚动短期范围???

(抱歉,这是种双重问题,但它的彩色滚动条,将得到蜱)

感谢您的一切可能的帮助和想法。

编辑:没有代码示例对不起,因为我试图在我的头脑中计划出这件事......你会发现它将是一个长文本窗格,并带有快速搜索功能。用户需要加载这个大文件并快速访问细节。目前,我正在为加载速度保持轻量级。其次,文本将是动态的,所以通过单击一个单词,它会在滚动条中放入一个条纹,就像搜索被激活一样。目前我们只是说它是一个带滚动条的简单文本区域。

+0

一些示例代码从工作将是一个良好的开端TBH – Mark

+1

也许从这里开始:HTTP:/ /explodingpixels.wordpress.com/2008/12/08/skinning-a-scroll-bar-part-1/真的,我会考虑编写一个监听器和一个扩展滚动条的类。使用使用监听器通过一种方法用新图像更新滚动条,您将写入您的新滚动条类 – Mark

+0

不错的链接,明天我会检查它,我正在考虑放置图像,但因为我从来没有定制过JScrollPane我不知道什么是可能的... – xchiltonx

回答

1

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.regex.*; 
import javax.swing.*; 
import javax.swing.text.*; 
import javax.swing.plaf.metal.MetalScrollBarUI; 

public class ScrollBarSearchHighlighterTest { 
    private static final Highlighter.HighlightPainter highlightPainter 
    = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 
    private static final String pattern = "Swing"; 
    private static final String initTxt = 
    "Trail: Creating a GUI with JFC/Swing\n" + 
    "Lesson: Learning Swing by Example\n" + 
    "This lesson explains the concepts you need to\n" + 
    " use Swing components in building a user interface.\n" + 
    " First we examine the simplest Swing application you can write.\n" + 
    " Then we present several progressively complicated examples of creating\n" + 
    " user interfaces using components in the javax.swing package.\n" + 
    " We cover several Swing components, such as buttons, labels, and text areas.\n" + 
    " The handling of events is also discussed,\n" + 
    " as are layout management and accessibility.\n" + 
    " This lesson ends with a set of questions and exercises\n" + 
    " so you can test yourself on what you've learned.\n" + 
    "http://docs.oracle.com/javase/tutorial/uiswing/learn/index.html\n"; 

    private final JTextArea textArea = new JTextArea(); 
    private final JScrollPane scroll = new JScrollPane(textArea); 
    private final JScrollBar scrollbar = new JScrollBar(JScrollBar.VERTICAL); 
    public JComponent makeUI() { 
    textArea.setEditable(false); 
    textArea.setLineWrap(true); 
    textArea.setText(initTxt+initTxt+initTxt); 
    scrollbar.setUnitIncrement(10); 

    scrollbar.setUI(new MetalScrollBarUI() { 
     @Override protected void paintTrack(
      Graphics g, JComponent c, Rectangle trackBounds) { 
     super.paintTrack(g, c, trackBounds); 
     Rectangle rect = textArea.getBounds(); 
     double sy = trackBounds.getHeight()/rect.getHeight(); 
     AffineTransform at = AffineTransform.getScaleInstance(1.0, sy); 
     Highlighter highlighter = textArea.getHighlighter(); 
     g.setColor(Color.YELLOW); 
     try{ 
      for(Highlighter.Highlight hh: highlighter.getHighlights()) { 
      Rectangle r = textArea.modelToView(hh.getStartOffset()); 
      Rectangle s = at.createTransformedShape(r).getBounds(); 
      int h = 2; //Math.max(2, s.height-2); 
      g.fillRect(trackBounds.x+2, trackBounds.y+1+s.y, trackBounds.width, h); 
      } 
     } catch(BadLocationException e) { 
      e.printStackTrace(); 
     } 
     } 
    }); 
    scroll.setVerticalScrollBar(scrollbar); 

    Box box = Box.createHorizontalBox(); 
    box.add(Box.createHorizontalGlue()); 
    box.add(new JButton(new AbstractAction("highlight") { 
     @Override public void actionPerformed(ActionEvent e) { 
     setHighlight(textArea, pattern); 
     } 
    })); 
    box.add(Box.createHorizontalStrut(2)); 
    box.add(new JButton(new AbstractAction("clear") { 
     @Override public void actionPerformed(ActionEvent e) { 
     textArea.getHighlighter().removeAllHighlights(); 
     scrollbar.repaint(); 
     } 
    })); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(scroll); 
    p.add(box, BorderLayout.SOUTH); 
    return p; 
    } 
    public void setHighlight(JTextComponent jtc, String pattern) { 
    Highlighter highlighter = jtc.getHighlighter(); 
    highlighter.removeAllHighlights(); 
    Document doc = jtc.getDocument(); 
    try{ 
     String text = doc.getText(0, doc.getLength()); 
     Matcher matcher = Pattern.compile(pattern).matcher(text); 
     int pos = 0; 
     while(matcher.find(pos)) { 
     int start = matcher.start(); 
     int end = matcher.end(); 
     highlighter.addHighlight(start, end, highlightPainter); 
     pos = end; 
     } 
    }catch(BadLocationException e) { 
     e.printStackTrace(); 
    } 
    scroll.repaint(); 
    } 
    public void removeHighlights(JTextComponent jtc) { 
    Highlighter hilite = jtc.getHighlighter(); 
    Highlighter.Highlight[] hilites = hilite.getHighlights(); 
    for(int i=0; i<hilites.length; i++) { 
     if(hilites[i].getPainter() instanceof 
      DefaultHighlighter.DefaultHighlightPainter) { 
     hilite.removeHighlight(hilites[i]); 
     } 
    } 
    scroll.repaint(); 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new ScrollBarSearchHighlighterTest().makeUI()); 
    frame.setSize(320, 240); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 
} 

或者另一种选择是使用 “MatteBorder +图标+的rowHeader”:JScrollBar search highlighter