我有一个显示一些信息的AWT画布(第三方库)。我需要在它上面显示一个滚动窗格。由于画布是AWT,我需要使用ScrollPane而不是JScrollPane。我想给滚动条提供一个圆形边框 - 这在AWT中是否可能?或者有什么方法可以在画布上使用JScrollPane并且仍然显示它(我认为最新版本的Java支持更好地混合轻量级/重量级组件,但我们假设这不是一个选项)。
谢谢, 杰夫
答案 0 :(得分:0)
“由于画布是AWT,我需要使用ScrollPane而不是JScrollPane。”
这是为什么?我想你可以使用JScrollPane。
Canvas extends java.awt.Component
,还有一个构造函数JScrollPane(java.awt.component component)
答案 1 :(得分:0)
我最初想到在JScrollPane
JPopupMenu
内setLightWeightPopupEnabled(false)
使用JScrollPane
。但是,这会在组件上方的新顶级窗口中弹出 - 因此任何圆形边框都会在顶级窗口的顶部绘制。它看起来像一个灰色矩形,顶部绘有ScrollPane
,边框为圆角。
然后我考虑将Panel
放入setOpaque()
,以便能够处理周围的圆形边框。不幸的是,AWT组件没有像Swing组件那样的Container
属性,因此它们是矩形的。我可以复制与父级相同的背景颜色,但是如果你想在一些数据之上显示它,那将是非常明显的。
我最终提出的妥协方法是让ScrollPane
组件绘制package stackoverflow;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.List;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.ScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CanvasPopup {
public static void main(String[] args) {
final Frame f = new Frame("CanvasPopup");
final ScrollPane scroll = new ScrollPane();
final Panel c = new Panel(null) {
@Override
public void paint(Graphics g) {
g.setColor(Color.GREEN);
g.fillRect(0, 0, getWidth(), getHeight());
if (scroll.isVisible()) {
g.setColor(Color.RED);
Rectangle bounds = scroll.getBounds();
g.fillRoundRect(bounds.x - 10, bounds.y - 10,
bounds.width + 20, bounds.height + 20, 15, 15);
}
}
};
final List list = new List();
for (int i = 0; i<100; i++) {
list.add("Item " + i);
}
scroll.add(list);
scroll.setBounds(75, 75, 150, 150);
scroll.setVisible(false);
c.add(scroll);
c.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (!scroll.isVisible()) {
scroll.setLocation(e.getPoint());
}
scroll.setVisible(!scroll.isVisible());
c.repaint();
}
});
f.add(c);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
子项周围的边框。这绝对是一个黑客解决方案,但它是迄今为止唯一有效的解决方案......这是最终的代码:
{{1}}