Salve a tutti, riprendo un tema discusso in altri forum per chiedere consiglio su come personalizzare al meglio una JScrollBar di una JTextArea, nello specifico ho cercato di renderla simile alla scrollBar presente in Windows 7 (frecce) con thumb simile a quello di Windows 8.

Sono riuscito a creare due scrollBar come nella seguente immagine:

EsempioScrollBar.png

Ecco il codice utilizzato (preciso che ho in gran parte utilizzato e adattato alle mie esigenze pezzi di codice trovati online):

classe principale:

codice:
import java.awt.*;
import javax.swing.*;
public class TestScrollBar
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run(){
                try{
                    new TestScrollBar();
                }
                catch(Exception e){}
            }
        });
    }
    public TestScrollBar()
    {
JFrame f=new JFrame("Test ScrollBar"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textArea=new JTextArea(20,20); JScrollPane scroll=new JScrollPane(textArea); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JScrollBar vsb=scroll.getVerticalScrollBar();
JScrollBar hsb=scroll.getHorizontalScrollBar(); vsb.setUI(new ScrollBar()); hsb.setUI(new ScrollBar()); f.getContentPane().add(scroll,BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
} }

classe per la scrollbar:

codice:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.plaf.basic.BasicScrollBarUI;
import javax.swing.*;
public class ScrollBar extends BasicScrollBarUI
{
    Image imageThumb,imageTrack;
    JButton decreaseButton,increaseButton;
    public ScrollBar()
    {
        imageThumb=createImage(16,16,new Color(192,192,192));
        imageTrack=createImage(16,16,new Color(240,240,240));
    }
    protected void paintThumb(Graphics g, JComponent c, Rectangle r)
    {
        ((Graphics2D)g).drawImage(imageThumb,r.x,r.y,r.width,r.height,null);
    }
    protected void paintTrack(Graphics g, JComponent c, Rectangle r)
    {
        ((Graphics2D)g).drawImage(imageTrack,r.x,r.y,r.width,r.height,null);
    }
    protected JButton createDecreaseButton(int orientation)
    {
        if(orientation==NORTH)return createButton("NorthArrow.png",m);
        else return createButton("WestArrow.png",m);        
    }    
    protected JButton createIncreaseButton(int orientation)
    {
        if(orientation==SOUTH)return createButton("SouthArrow.png",m);
        else return createButton("EastArrow.png",m);
    }    
    public static JButton createButton(String src,MouseListener m)
    {
        JButton b=new JButton(new ImageIcon(ClassLoader.getSystemResource(src)));
        b.setPreferredSize(new Dimension(15,15));
        b.setMargin(new Insets(0,0,0,0));
        b.setBorder(BorderFactory.createLineBorder(new Color(240,240,240),1));
        b.setOpaque(false);
        b.addMouseListener(m);
        return b;
    }
    static Image createImage(int w,int h,Color c)
    {
        BufferedImage b=new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d=b.createGraphics();
        g2d.setPaint(c);
        g2d.fillRect(0,0,w,h);
        g2d.dispose();
        return b;
    }    
    MouseListener m=new MouseListener()
    {
        public void mousePressed(MouseEvent e)
        {
            ((JButton)e.getComponent()).setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
        }
        public void mouseReleased(MouseEvent e)
        {
            ((JButton)e.getComponent()).setBorder(BorderFactory.createLineBorder(new Color(240,240,240),1));
        }
        public void mouseClicked(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
    };
}


Intanto vorrei sapere se quanto utilizzato può andare bene (sembra funzionare ma data la mia poca esperienza potrebbero esserci cose scorrette).

Vorrei poi sapere se avete idea di come si potrebbe modificare l'aspetto della parte interna della barra (thumb) quando viene trascinata.

Grazie

PS: allego in questo messaggio e nel prossimo (mi permette di inserire solo 3 allegati per messaggio) le frecce utilizzate

WestArrow.pngEastArrow.png