2013-10-24 3 views
1

아래 코드를 사용하여 jScrollPane을 사용자 정의하려고합니다. 그것은 작동, 그것은 내가 원하는 방식으로 색상을 변경하지만, 화살표 버튼을 숨 깁니다.사용자 정의 스크롤 막대 화살표

내가 원하는 것은 다시 보이게하고 맞춤 이미지로 변경하는 것입니다. 이 포럼에서 검색을 시도했지만 그 정보를 찾을 수 없습니다.

누군가가 나를 도울 수 있기를 바랍니다. 미리 감사드립니다!

private Image imageThumb, imageTrack; 
    private JButton b = new JButton() { 
     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(0, 0); 
     } 
    }; 

    public YourScrollbarUI() { 
     imageThumb = WrapImage .create(45, 45, new Color(46,218,163)); 
     imageTrack = WrapImage .create(32, 32, new Color(90,90,90)); 
    } 

    @Override 
    protected void paintThumb(Graphics g, JComponent c, Rectangle r) { 
     g.setColor(Color.blue); 
     ((Graphics2D) g).drawImage(imageThumb, 
       r.x, r.y, r.width, r.height, null); 
    } 

    @Override 
    protected void paintTrack(Graphics g, JComponent c, Rectangle r) { 
     ((Graphics2D) g).drawImage(imageTrack, 
       r.x, r.y, r.width, r.height, null); 
    } 

    @Override 
    protected JButton createDecreaseButton(int orientation) { 
     return b; 
    } 

    @Override 
    protected JButton createIncreaseButton(int orientation) { 
     return b; 
    } 

private static class WrapImage { 

    static public Image create(int w, int h, Color c) { 
     BufferedImage bi = new BufferedImage(
       w, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = bi.createGraphics(); 
     g2d.setPaint(c); 
     g2d.fillRect(0, 0, w, h); 
     g2d.dispose(); 
     return bi;}} 

답변

2

그것은 색상 내가 원하는 방식을 변경하지만, arrowbuttons을 숨 깁니다. 코드 b 버튼에서

private JButton b = new JButton() { 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(0, 0); // why (0,0) ??? 
    } 
}; 

createDecreaseButtoncreateIncreaseButton 방법을 통해 화살표 그림에 대한 책임 : 여기

문제입니다. 기본 크기가 (0,0)이면 논리적으로 볼 수 없습니다.

내가 원하는 것은 다시 보이게하고 맞춤 이미지로 변경하는 것입니다.

당신은 그들이 원하는 아이콘으로 새 JButton을 반환 할 createDecreaseButtoncreateIncreaseButton을 수정해야합니다.

업데이트

나는 이미 prefferedsize (그들에게 사용자 정의 이미지와 같은 크기를 만드는)와 함께 연주 시도하지만, 사용자 정의 arrowimages가 표시되지 여전히. 우둔한

이 작동 예제를보십시오. MyScrollbarUI은 수업과 마찬가지로 BasicScrollBarUI에서 확장됩니다. 열쇠가 버튼의 getPreferredSize() 메소드를 오버라이드하고 필요에 따라 적절한 아이콘을 설정하는 것을 볼 수 있습니다.

이 점에 관해서는 BasicScrollBarUI.createDecreaseButton(int orientation)BasicScrollBarUI.createIncreaseButton(int orientation) 메쏘드의 문서화가 잘되어 있지 않습니다 (javadoc은 없습니다). 그러나 IDE를 사용하여이 클래스로 들어가면 orientation 매개 변수는 SwingConstants.NORTH, SwingConstants.SOUTH, SwingConstants.EAST, SwingConstants.WEST 중 하나를 취할 수 있습니다. getAppropriateIcon(int orientation) 메소드를 보면이를 명심하십시오.

이 사용되는 아이콘 : Up arrowDown arrowLeft arrowRight arrow

import java.awt.Dimension; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicScrollBarUI; 

public class Demo { 

    private void initGUI(){ 
     JScrollPane scrollPane = new JScrollPane(new JTextArea(10, 20)); 
     scrollPane.getHorizontalScrollBar().setUI(new MyScrollbarUI()); 
     scrollPane.getVerticalScrollBar().setUI(new MyScrollbarUI()); 

     JFrame frame = new JFrame("Demo"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(scrollPane); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) {   
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Demo().initGUI(); 
      } 
     }); 
    } 

    class MyScrollbarUI extends BasicScrollBarUI { 

     private ImageIcon downArrow, upArrow, leftArrow, rightArrow; 

     public MyScrollbarUI(){ 
      try { 
       upArrow = new ImageIcon(new java.net.URL("http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/16/Actions-arrow-up-icon.png")); 
       downArrow = new ImageIcon(new java.net.URL("http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/16/Actions-arrow-down-icon.png")); 
       rightArrow = new ImageIcon(new java.net.URL("http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/16/Actions-arrow-right-icon.png")); 
       leftArrow = new ImageIcon(new java.net.URL("http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/16/Actions-arrow-left-icon.png")); 
      } catch (java.net.MalformedURLException ex) { 
       ex.printStackTrace(); 
      }   
     } 

     @Override 
     protected JButton createDecreaseButton(int orientation) { 
      JButton decreaseButton = new JButton(getAppropriateIcon(orientation)){ 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(22, 22); 
       } 
      }; 
      return decreaseButton; 
     } 

     @Override 
     protected JButton createIncreaseButton(int orientation) { 
      JButton increaseButton = new JButton(getAppropriateIcon(orientation)){ 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(22, 22); 
       } 
      }; 
      return increaseButton; 
     } 

     private ImageIcon getAppropriateIcon(int orientation){ 
      switch(orientation){ 
       case SwingConstants.SOUTH: return downArrow; 
       case SwingConstants.NORTH: return upArrow; 
       case SwingConstants.EAST: return rightArrow; 
        default: return leftArrow; 
      } 
     } 
    }  

} 

스크린 샷

enter image description here

+0

은 내가 createDecreaseButton 및 createIncreaseButton을 수정하여 코드를하려고했으나 사용자 정의 아이콘이 표시되지 않는 . 대신 표준 Jbutton (내가 생각하는 것)의 작은 부분을 보여주고 있습니다. 어떻게 해결할 수 있을까요? –

+0

@RichardAvalos 당신은 이미 getPreferredSize 메소드를 오버라이드 할 수 있습니다. (이미 했었지만'(0,0)'을 돌려 주면 버튼이 보이지 않습니다). 업데이트 된 답변보기 그것은 단지 예일뿐입니다. 당신은 분명 더 잘 할 수 있습니다. – dic19

+0

늦은 응답을 위해 Srry. 나는 이미 prefferedsize (사용자 정의 이미지와 크기가 같음)로 노려 보았지만 사용자 정의 화살표 이미지는 여전히 나타나지 않습니다. 나는 단서가 없습니다 –

관련 문제