0

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

谢谢,杰夫

4

2 回答 2

0

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

为什么是这样?我认为您可以使用 JScrollPane。

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

于 2010-01-13T15:01:02.110 回答
0

我最初玩弄了使用JScrollPaneinside a JPopupMenuwith的想法setLightWeightPopupEnabled(false)。但是,这会在组件上方的新顶级窗口中弹出 - 因此任何圆形边框都绘制在顶级窗口的顶部。它看起来像一个灰色矩形,JScrollPane顶部画有圆角边框。

然后我想把它ScrollPane放入一个Panel可以处理在它周围绘制圆形边框的地方。不幸的是,AWT 组件没有setOpaque()Swing 组件那样的属性,所以它们是矩形的。我可以复制与父对象相同的背景颜色,但如果您想在某些数据之上显示它,那将是非常明显的。

我最终想出的折衷方法是让组件在孩子Container周围绘制边框。ScrollPane这绝对是一个 hack-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);
    }

}  
于 2010-01-13T21:22:04.213 回答