自定义AWT ScrollPane

时间:2010-01-13 14:57:39

标签: java awt scrollpane

我有一个显示一些信息的AWT画布(第三方库)。我需要在它上面显示一个滚动窗格。由于画布是AWT,我需要使用ScrollPane而不是JScrollPane。我想给滚动条提供一个圆形边框 - 这在AWT中是否可能?或者有什么方法可以在画布上使用JScrollPane并且仍然显示它(我认为最新版本的Java支持更好地混合轻量级/重量级组件,但我们假设这不是一个选项)。

谢谢, 杰夫

2 个答案:

答案 0 :(得分:0)

“由于画布是AWT,我需要使用ScrollPane而不是JScrollPane。”

这是为什么?我想你可以使用JScrollPane。

Canvas extends java.awt.Component,还有一个构造函数JScrollPane(java.awt.component component)

答案 1 :(得分:0)

我最初想到在JScrollPane JPopupMenusetLightWeightPopupEnabled(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}}