我有一个显示一些信息的AWT画布(第三方库)。我需要在上面显示一个滚动窗格。由于画布是AWT,我需要使用ScrollPane而不是JScrollPane。我想给这个scrollpane设置一个圆形的边框 - 在AWT中是否可以这样做?或者有什么方法可以在画布上使用JScrollPane,并且仍然能够显示出来(我认为最新版本的Java支持轻量级/重量级组件的更好混合,但让我们假设这不是一种选择)。自定义AWT ScrollPane
感谢, 杰夫
我有一个显示一些信息的AWT画布(第三方库)。我需要在上面显示一个滚动窗格。由于画布是AWT,我需要使用ScrollPane而不是JScrollPane。我想给这个scrollpane设置一个圆形的边框 - 在AWT中是否可以这样做?或者有什么方法可以在画布上使用JScrollPane,并且仍然能够显示出来(我认为最新版本的Java支持轻量级/重量级组件的更好混合,但让我们假设这不是一种选择)。自定义AWT ScrollPane
感谢, 杰夫
“既然画布是AWT,我需要使用一个ScrollPane,而不是一个JScrollPane的。”
这是为什么?我认为你可以使用JScrollPane。
Canvas extends java.awt.Component
,并有一个构造函数JScrollPane(java.awt.component component)
画布不在滚动窗格中。滚动窗格是位于画布顶部的弹出组件的一部分。 – 2010-01-13 15:04:47
我最初使用JScrollPane
内JPopupMenu
与setLightWeightPopupEnabled(false)
的想法玩弄周围。但是,这会在组件上方的新顶层窗口中弹出 - 因此任何圆角边框都将绘制在顶层窗口的顶部。它看起来像一个灰色的矩形,上面画有圆形边框的JScrollPane
。
然后我考虑将ScrollPane
放入Panel
中,它可以处理它周围的圆形边框。不幸的是,AWT组件没有像Swing组件那样的setOpaque()
属性,所以它们是矩形的。我可以复制与父项相同的背景颜色,但是如果您想在某些数据的顶部显示此项,则会非常明显。
我最终想出的妥协方法是让Container
组件绘制围绕ScrollPane
孩子的边界。这是肯定更多的是黑客-Y的解决方案,但它是唯一一个至今多数民众赞成工作......这里的最终代码:
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);
}
}
您提到您的意见一个弹出窗口 - 你可以提供更多的细节?弹出菜单? JPopupMenu的?弹出/ PopupFactory? – Nate 2010-01-13 15:50:20
在我的应用程序中,您可以点击显示屏上的项目。点击该项目后,会弹出关于该项目的信息。可以有很多信息,所以我想把它放在一个滚动窗格中。被点击的项目必须位于3D画布上,所以我正在尝试显示有关该项目的可滚动文字。理想情况下,我想自定义弹出框的边框,使其具有“圆角”效果。 – 2010-01-13 15:52:25
那么,你描述了你想要的 - 但我不能确定你想要什么是可能的,因为我不知道使用什么类型的组件/类来生成弹出窗口。它可以直接绘制在3D画布上,或者可以使用我之前评论中提到的其中一个类。您是否有启动弹出窗口的代码?或者如何为弹出窗口提供内容? – Nate 2010-01-13 18:57:53