Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组件边界外的全功能图形?setClip()用法和其他_Java_Swing_Jpanel_Clipping - Fatal编程技术网

Java 组件边界外的全功能图形?setClip()用法和其他

Java 组件边界外的全功能图形?setClip()用法和其他,java,swing,jpanel,clipping,Java,Swing,Jpanel,Clipping,我设计了简单的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(), g

我设计了简单的
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);
}
}
这个类的测试表明它只能部分工作(代码如下)。例如,按钮绘制在面板外部,而背景感觉在边界内部,按钮视觉效果也感觉在边界内部

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

更新

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);


        }

    });

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

使用代码

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);


        }

    });

}
}

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


所以我不会依赖于setClip——即使你能找到一种巧妙的方法来像这样使用它,它也会在某个时候崩溃

那么,什么是替代方案呢?我不知道你想要实现什么,但你可能不需要画出超出其边界的组件就可以拥有它。我想在这种情况下,你不应该试图“跳出框框思考”:)我很想,但没有办法。我需要以最小的努力将一些控件扩展到负坐标值。@SuzanCioc组件和嵌套它们的全部目的是减少它们应用的范围。如果您需要绘制超出其边界的图形,这只能意味着两件事:1)您的组件边界不正确,太小和/或位置不正确2)您没有在适当的组件上绘制,应该在其祖先之一上绘制。我需要设计带有网格的无限坐标板,该网格可以向所有方向滚动。有两种可能的方法:(1)编写完全定制的组件,(2)尝试重用Swing中的某些东西。我试着重复使用,但一直在打石头。这些石头是Swing创建者的想法,认为零是宇宙中的最小整数,他们在许多地方没有任何明确的理由对其进行了硬编码。应该永远不需要修改生成的图形上下文的剪切矩形(如果是您制作的,请随意操作),Swing在调用paint之前已经设置了剪切矩形。您可以检查剪切矩形以确定要绘制的区域,并优化代码,如果需要,只更新该区域wish@MadProgrammer这只是我发现的一种方式;我理解修改剪辑是不正确的;我想修改Swing设置它的方式,但我不能