Java Swing:整个ScrollBar的背景(不显示)
Java Swing: background of the whole ScrollBar (doesn't show up)
我正在开发一个 swing 应用程序(让我们省略为什么)。
我需要自定义滚动条设计。到目前为止一切顺利,我实现了 ScrollBarUI 的后代——我有自定义按钮、自定义拇指、自定义轨道……除了我的按钮周围的区域——我在那里添加了一些填充,然后我想把我所有的滚动条都包裹成一个圆角的矩形。
因为我还没有找到在 ScrollBarUI 中做到这一点的方法,所以我决定扩展 JScrollPane(扩展 ScrollBar在那里,所以我可以在 paintComponent 中绘制我的圆角矩形。这是我做的:
public class MyScrollPane extends JScrollPane {
public MyScrollPane(Component view) {
super(view);
}
@Override
public JScrollBar createVerticalScrollBar() {
return new MyScrollBar(JScrollBar.VERTICAL);
}
@Override
public JScrollBar createHorizontalScrollBar() {
return new MyScrollBar(JScrollBar.HORIZONTAL);
}
protected class MyScrollBar extends ScrollBar {
public MyScrollBar(int orientation) {
super(orientation);
setUI(MyScrollBarUI.createUI(this));
setOpaque(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int borderDiameterX = 32;
int borderDiameterY = 32;
g2.translate(this.getX(), this.getY());
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.gray);
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, borderDiameterX, borderDiameterY);
g2.translate(-this.getX(), -this.getY());
}
}
}
不幸的是,这不起作用:
- if
setOpacity(true)
- 它在按钮周围绘制默认颜色的正方形
- if
setOpacity(false)
- 它不绘制背景
调用代码,我查过了。 scrollbar内部元素thumb, button都可以
我错过了什么?
好的。我的代码中有 3 个问题。
setOpacity
必须 false
以防止内置背景绘制。
g2.translate
- 不需要,无意识地从 ScrollBarUI 代码中复制
super.paintComponent(g)
- 我将它移到了我的 paintComponent 的末尾,否则在 MyScrollBarUI 中绘制在我绘制的背景后面。
所以现在看起来像这样:
public class MyScrollPane extends JScrollPane {
public MyScrollPane(Component view) {
super(view);
}
@Override
public JScrollBar createVerticalScrollBar() {
return new MyScrollBar(JScrollBar.VERTICAL);
}
@Override
public JScrollBar createHorizontalScrollBar() {
return new MyScrollBar(JScrollBar.HORIZONTAL);
}
protected class MyScrollBar extends ScrollBar {
public MyScrollBar(int orientation) {
super(orientation);
setUI(MyScrollBarUI.createUI(this));
setOpaque(false);
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
int borderDiameter = 32;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.gray);
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, borderDiameter, borderDiameter);
super.paintComponent(g);
}
}
}
我正在开发一个 swing 应用程序(让我们省略为什么)。
我需要自定义滚动条设计。到目前为止一切顺利,我实现了 ScrollBarUI 的后代——我有自定义按钮、自定义拇指、自定义轨道……除了我的按钮周围的区域——我在那里添加了一些填充,然后我想把我所有的滚动条都包裹成一个圆角的矩形。
因为我还没有找到在 ScrollBarUI 中做到这一点的方法,所以我决定扩展 JScrollPane(扩展 ScrollBar在那里,所以我可以在 paintComponent 中绘制我的圆角矩形。这是我做的:
public class MyScrollPane extends JScrollPane {
public MyScrollPane(Component view) {
super(view);
}
@Override
public JScrollBar createVerticalScrollBar() {
return new MyScrollBar(JScrollBar.VERTICAL);
}
@Override
public JScrollBar createHorizontalScrollBar() {
return new MyScrollBar(JScrollBar.HORIZONTAL);
}
protected class MyScrollBar extends ScrollBar {
public MyScrollBar(int orientation) {
super(orientation);
setUI(MyScrollBarUI.createUI(this));
setOpaque(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int borderDiameterX = 32;
int borderDiameterY = 32;
g2.translate(this.getX(), this.getY());
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.gray);
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, borderDiameterX, borderDiameterY);
g2.translate(-this.getX(), -this.getY());
}
}
}
不幸的是,这不起作用:
- if
setOpacity(true)
- 它在按钮周围绘制默认颜色的正方形 - if
setOpacity(false)
- 它不绘制背景
调用代码,我查过了。 scrollbar内部元素thumb, button都可以
我错过了什么?
好的。我的代码中有 3 个问题。
setOpacity
必须false
以防止内置背景绘制。g2.translate
- 不需要,无意识地从 ScrollBarUI 代码中复制super.paintComponent(g)
- 我将它移到了我的 paintComponent 的末尾,否则在 MyScrollBarUI 中绘制在我绘制的背景后面。
所以现在看起来像这样:
public class MyScrollPane extends JScrollPane {
public MyScrollPane(Component view) {
super(view);
}
@Override
public JScrollBar createVerticalScrollBar() {
return new MyScrollBar(JScrollBar.VERTICAL);
}
@Override
public JScrollBar createHorizontalScrollBar() {
return new MyScrollBar(JScrollBar.HORIZONTAL);
}
protected class MyScrollBar extends ScrollBar {
public MyScrollBar(int orientation) {
super(orientation);
setUI(MyScrollBarUI.createUI(this));
setOpaque(false);
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
int borderDiameter = 32;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.gray);
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, borderDiameter, borderDiameter);
super.paintComponent(g);
}
}
}