Java 自定义滚动条箭头
我正在尝试使用下面的代码定制一个jScrollPane。它可以工作,它可以按我想要的方式更改颜色,但隐藏了箭头按钮 我想要的是使它们再次可见,并使用自定义图像更改它们。我试着在这个论坛上搜索,但找不到任何关于它的信息 我希望有人能帮助我。提前谢谢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
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请参阅更新的答案。希望对您有所帮助:)