2013-10-24 131 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。

這裏的問題是:

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

在你的代碼b按鈕是負責通過createDecreaseButtoncreateIncreaseButton方法畫的箭頭。如果它的首選尺寸是(0,0)那麼在邏輯上它將不可見。

我想要的是讓它們再次可見並用 定製圖像進行更改。

您需要修改createDecreaseButtoncreateIncreaseButton以使它們與所需的圖標返回一個新JButton

更新

我已經嘗試過與prefferedsize(使它們相同 大小的自定義圖像)玩,但自定義arrowimages仍然沒有 顯示出來。 Im clueless

看看這個工作示例。 MyScrollbarUIBasicScrollBarUI延伸,就像你的班級一樣。您會看到該按鍵超出了按鈕的方法並根據需要設置了適當的圖標。

在這方面,我應該說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

姍姍來遲的迴應。我已經嘗試使用prefferedsize(使它們與自定義圖像大小相同),但自定義的arrowimages仍未顯示出來。 Im無能 –