Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义滚动条箭头_Java_Image_Swing_Custom Component_Jscrollbar - Fatal编程技术网

Java 自定义滚动条箭头

Java 自定义滚动条箭头,java,image,swing,custom-component,jscrollbar,Java,Image,Swing,Custom Component,Jscrollbar,我正在尝试使用下面的代码定制一个jScrollPane。它可以工作,它可以按我想要的方式更改颜色,但隐藏了箭头按钮 我想要的是使它们再次可见,并使用自定义图像更改它们。我试着在这个论坛上搜索,但找不到任何关于它的信息 我希望有人能帮助我。提前谢谢 private Image imageThumb, imageTrack; private JButton b = new JButton() { @Override public Dimension g

我正在尝试使用下面的代码定制一个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;}}
它会按我想要的方式更改颜色,但会隐藏箭头按钮

问题是:

private JButton b = new JButton() {
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(0, 0); // why (0,0) ???
    }
};
在代码
b
中,按钮负责通过
createDecreaseButton
createIncreaseButton
方法绘制箭头。如果其首选大小为
(0,0)
,则从逻辑上讲,它将不可见

我想要的是使它们再次可见,并使用 自定义图像

您需要修改
createDecreaseButton
createIncreaseButton
以使它们返回带有所需图标的新
JButton

更新

我已经尝试过使用PreferedSize(使它们相同) 大小与自定义图像相同),但自定义箭头图像仍不可用 出现了。我不懂

看看这个工作示例
MyScrollbarUI
扩展自,就像您的类一样。您将看到该键覆盖了按钮的
getPreferredSize()
方法,并根据需要设置相应的图标

在这方面,我应该说和方法的文档记录很差(没有javadoc)。但是如果您使用IDE进入这个类,您将看到
orientation
参数可以取以下值之一:
SwingConstants.NORTH、SwingConstants.SOUTH、SwingConstants.EAST、SwingConstants.WEST
。查看
getpropertiecon(int-orientation)
方法时,请记住这一点

这些是常用的图标:

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;
            }
        }
    }    

}
屏幕截图


我通过修改createDecreaseButton和CreateEncreaseButton尝试了您的代码,但自定义图标没有显示出来。相反,它显示了一小部分(我认为它是)标准Jbutton。我们如何解决这个问题?@RichardAvalos您可以尝试覆盖getPreferredSize方法(您已经这样做了,但返回了
(0,0)
,这使得按钮不可见)。请参阅更新的答案。这只是一个例子。你当然可以做得更好。感谢你迟来的回复。我已经尝试过使用PreferedSize(使其与自定义图像大小相同),但自定义箭头图像仍然没有显示。伊姆河clueless@RichardAvalos请参阅更新的答案。希望对您有所帮助:)