我决定在秋千和定制绘画组件的材料中潜入一点。最近几天,我在StackOverFlow和其他论坛上阅读了大量文章,API文档和问题。但我在理解这个概念时仍然遇到了一些基本问题。
我想做什么:基本上,我想为我自己的 Swing GUI 设计一些组件。我在设计自定义 JButton 时没有太多问题。我只是在 paint.net 中创建一个自定义图像,创建一个ImageIcon并制作JButton.setIcon(ImageIcon(,工作正常。如果我想自定义 JSlider 的拇指,同样的故事。我在这里找到了一个非常有趣的解决方案。它只是覆盖默认的拇指,在第二步中,它将"Slider.horizontalThumbIcon"的自定义ImageIcon(通过ClassLoader使用我的自定义createImageIcon类(放入UIManger。
UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon", new Icon(){
public int getIconHeight() {
return 0;
}
public int getIconWidth() {
return 0;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
//do nothing
}
});
和
UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon",
createImageIcon("images/slider.png"));
但现在问题开始了。如果我没记错的话,ScrollBar 的拇指不是图标,所以我必须创建一个自己的"CustomScrollBarUI"类来扩展 BasicScrollBarUI。此外,我不想要任何箭头键。好的,所以我做了以下事情(从这里的一些示例代码中再次启发我(:
public class CustomScrollBarUI extends BasicScrollBarUI {
private ImageIcon img;
protected JButton createZeroButton() {
JButton button = new JButton("zero button");
Dimension zeroDim = new Dimension(0,0);
button.setPreferredSize(zeroDim);
button.setMinimumSize(zeroDim);
button.setMaximumSize(zeroDim);
return button;
}
protected JButton createDecreaseButton(int orientation) {
return createZeroButton();
}
protected JButton createIncreaseButton(int orientation) {
return createZeroButton();
}
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
BufferedImage img = new LoadBackgroundImage("images/slider.png").getImage();
g.drawImage(img, 0, 0, new Color(255,255,255,0), null);
}
protected void setThumbBounds(int x, int y,int width,int height){
super.setThumbBounds(x, y, 14, 14);
}
protected Rectangle getThumbBounds(){
return new Rectangle(super.getThumbBounds().x,super.getThumbBounds().y,14,14);
}
protected Dimension getMinimumThumbSize(){
return new Dimension(14,14);
}
protected Dimension getMaximumThumbSize(){
return new Dimension(14,14);
}
}
LoadBackGroundImage 是一个自己的类,它通过 ClassLoader 创建 BufferedImage。滚动条的拇指现在是我的自定义"滑块.png",但它不会移动。如果我向下拖动它,窗格会滚动,但拇指会留在他的位置。由于我还没有理解所有的机制,我读到了paintImage方法。在那里你必须提交一个 ImageObserver,我不太了解它的功能。我在网上找到了各种代码示例提交 null(就像我一样(,但我认为这不适用于必须移动(并因此重新绘制(的图像。我该如何解决这个问题?如果我在paintThumb方法中绘制普通图形,它可以正常工作,但是一旦我绘制图像,它就不会移动。
我希望有人能帮助我。提前谢谢。
在您的特定情况下 - 您总是在同一位置绘制图像@
:protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
BufferedImage img = new LoadBackgroundImage("images/slider.png").getImage();
g.drawImage(img, 0, 0, new Color(255,255,255,0), null);
}
这里的"0, 0"是滚动条坐标系中的"x, y"坐标(零放在左上角(。
您在paintThumb方法(矩形拇指边界(中收到指向当前拇指位置的拇指边界 - 只需使用这些值在适当的位置绘制图像即可。
如果您的拇指图像大小不适合收到的拇指边界,您可以计算其中间点和中心图像。这只是一个例子 - 你可以用任何其他你喜欢的方式做到这一点。
我想补充一点,各种 UI 中几乎每个单独的绘制方法都放置在同一个坐标系中,因此您始终必须使用接收的坐标/边界/...放置您正在绘制的内容或自己计算。