-1

I am working on a pixel art editor and I am having some problems with the JScrollBar.

The problem is:

I render a image on my scroll bar track but it stretches every time so I have to draw over 30 individual scroll bar track images and I was wondering if it's possible to just create one image and having it be in the right size itself.

package oktay.notepad.GUI;

import oktay.notepad.ColorSheme;
import oktay.notepad.Main;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.plaf.basic.BasicScrollBarUI;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * Created by asame on 08.06.2017.
 */
public class UIScrollBar extends BasicScrollBarUI implements MouseListener {

   public UIScrollBar() {

   }

   @Override
   protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
       try {

           g.drawImage(ImageIO.read(ClassLoader.getSystemResource("res/icons/scrolltrack.pn   g")), trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height, null);

       } catch (IOException e) {
        e.printStackTrace();
       }
   }

    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
    super.paintThumb(g, c, thumbBounds);
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

}

----------------------CustomScrollBar Class----------------------------

package oktay.notepad.GUI;

import javax.swing.*;

/**
 * Created by asame on 21.06.2017.
 */
public class CustomScrollBar extends JScrollBar {

    public CustomScrollBar() {
        setUI(new UIScrollBar());
    }

}

----------------------CustomScrollPane Class--------------------------

package oktay.notepad.GUI;

import javax.swing.*;
import java.awt.*;

/**
 * Created by asame on 21.06.2017.
 */
public class CustomScrollPane extends JScrollPane {

    public CustomScrollPane () {
        super (VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS);
        //setUI(new UIScrollPane());
        setHorizontalScrollBar(new CustomScrollBar());
        setVerticalScrollBar(new CustomScrollBar());
    }
}

Thanks for the help

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • 1) For better help sooner, post a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). 2) One way to get image(s) for an example is to hot link to images seen in [this Q&A](http://stackoverflow.com/q/19209650/418556). 3) *"The problem is: I render a image on my scroll bar track but it stretches every time so I have to draw over 30 individual scroll bar track images"* How is that a problem? Just use a loop. – Andrew Thompson Jun 21 '17 at 15:32

1 Answers1

0

You may use a TexturePaint, like this:

BufferedImage bi = ImageIO.read(ClassLoader.getSystemResource("res/icons/scrolltrack.png"));
TexturePaint paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight()));
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(paint);
g2.fill(new Rectangle(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height));
Jean-Baptiste Yunès
  • 34,548
  • 4
  • 48
  • 69
  • Thanks for the code. I tried it but it didn`t do what i needed. Here is a screenshot so you can see what i mean. http://imgur.com/a/kQD6i – Oktay Bekar Jun 22 '17 at 08:59