2013-01-05 5 views
3

Java에서 스크롤 막대를 사용자 정의하여 크롬과 같은 역할을하는 검색을 수행 할 수있는 방법은 무엇입니까? 결과가있는 곳에 색칠 된 줄무늬를 넣으시겠습니까?java 색이있는 스크롤 막대 검색 결과

라이브러리를 직접 코딩하고 싶지는 않습니다. 게다가 나는 내 L & F를 풀고 싶지 않습니다. 예를 환영합니다.

실제로는 큰 텍스트 파일이나 긴 jtable을 볼 수 있으며 누구나 효율적인 스크롤 막대를 사용하여이를 볼 수있는 좋은 아이디어가 있습니까? ... 끝까지 시작하는 이중 스크롤 막대와 짧은 범위를 스크롤하는 내부 스크롤러가 있어야합니까 ???

(미안 그것은 이중 질문의 종류의하지만 진드기를 얻을 것이다 컬러 스크롤 막대의) 모든 가능한 도움과 아이디어를

감사합니다.

EDIT : 코드 예제가 없습니다. 손에 머리를 내밀어 계획 중이므로 유감스럽게 생각합니다. 빠른 검색 기능을 갖춘 긴 텍스트 창이 표시됩니다. 사용자는이 큰 파일을로드하고 세부 정보에 빠르게 액세스해야합니다. 잠시 동안 나는 로딩 속도를 가볍게 유지하고 있습니다. 둘째 텍스트가 동적이 될 것이므로 단어를 클릭하면 검색 창이 활성화 된 것처럼 스크롤 막대에 줄무늬가 표시됩니다. 잠시 동안 스크롤 막대가있는 간단한 텍스트 영역이라고 말할 수 있습니다.

+0

일부 예제 코드는 TBH – Mark

+1

아마 여기 시작하는 좋은 시작이 될 것입니다에서 작업 : HTTP ://explodingpixels.wordpress.com/2008/12/08/skinning-a-scroll-bar-part-1/ 정말 스크롤바를 확장하는 리스너와 클래스 작성에 대해 살펴볼 것입니다. Using new Scrollbar 클래스에 쓰는 메소드를 통해 리스너를 사용하여 새로운 이미지로 스크롤바를 업데이트하십시오. – 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 + 아이콘 + 행 헤더"를 사용하는 것입니다 JScrollBar search highlighter