0

我设计了一个简单的JPanel扩展,我期望它能够在它的范围之外绘制:

public class JGlassPanel extends JPanel {

@Override
protected void paintBorder(Graphics g) {
}

@Override
protected void paintComponent(Graphics g) {
    if( getParent() != null ) {
        g.setClip(-getX(), -getY(), getX() + getWidth(), getY() + getHeight());
    }
    super.paintComponent(g);
}
}

这个类的测试表明它只能部分工作(下面的代码)。例如,按钮在面板外绘制,而背景在边界内感觉,按钮视觉效果也在边界内感觉。

是否可以将所有视觉特征扩展到任意区域?

更新

我发现覆盖contains制作按钮也在面板之外起作用(对点击做出反应)。同时,视觉效果和背景仍在组件范围内。

使用代码

public class Tester_JGlassPanel_01 {


public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {


            JButton button = new JButton("my button");
            button.setBounds(-50, -20, 100, 40);


            JGlassPanel panel = new JGlassPanel();
            //JPanel panel = new JPanel();
            panel.setLayout(null);
            panel.setBackground(Color.RED);
            panel.setBounds(100, 100, 100, 100);
            panel.add(button);

            JFrameEx frame = new JFrameEx();
            frame.setLayout(null);


            frame.add(panel);
            frame.setSize(0.5);
            frame.center();


            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            frame.setVisible(true);


        }

    });

}
}
4

1 回答 1

0

我认为 setClip 只是作为一种优化,即使绘图区域更小,而不是更大。Swing 充满了优化,除了 setClip 之外还有其他优化:背景显然只在组件的范围内绘制。

所以我不会依赖 setClip - 即使你能找到一个像这样使用它的棘手方法,它也会在某个时候中断。

于 2013-02-22T16:25:31.403 回答