Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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 如果第一坐标为0,0,则绘制方法在jFrame外部绘制_Java_Swing_Jframe_Paintcomponent - Fatal编程技术网

Java 如果第一坐标为0,0,则绘制方法在jFrame外部绘制

Java 如果第一坐标为0,0,则绘制方法在jFrame外部绘制,java,swing,jframe,paintcomponent,Java,Swing,Jframe,Paintcomponent,在这种情况下,第一个坐标应为0,0,而不是8,30。我做错了什么(我正在使用NetBeans) 将JPanel添加到框架中并在其中绘制。框架的坐标包括装饰(标题栏、边框等)。它看起来像这样: public class Test extends JFrame { public static void main(String[] args) { new Test(); } private Test() { add(new MyPanel())

在这种情况下,第一个坐标应为0,0,而不是8,30。我做错了什么(我正在使用NetBeans)


JPanel
添加到框架中并在其中绘制。框架的坐标包括装饰(标题栏、边框等)。它看起来像这样:

public class Test extends JFrame {
    public static void main(String[] args) {
        new Test();
    }
    private Test() {
        add(new MyPanel());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(600, 600);
        setVisible(true);
    }
    private class MyPanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.blue);
            g.drawRect(8, 30, 200, 200);
        }
    }
}

另外,不要调用
repaint()
paint()中。这将导致无限循环并冻结整个程序。

问题在于您的
绘制(…)
方法没有通过调用
getInsets
来考虑
JFrame
,如下所示:

如果已在此组件上设置边框,则返回边框的 插图

此代码工作正常:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.setColor(Color.blue);
                g.drawRect(0 + getInsets().left, 0 + getInsets().top, 200, 200);
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();
        frame.setVisible(true);
    }
}
然而,这不是最佳做法

而是将
JPanel
添加到
JFrame
并覆盖
JPanel的
paintComponent(Graphics g)
,不要忘记调用
super.paintComponent(g)
作为被覆盖方法中的第一个调用,然后在那里绘制(不要忘记覆盖
getPreferredSize()
并返回正确的
尺寸
s,这样
JPanel
将适合其绘图/图形内容)此问题将不再持续,因为
JPanel
在contentPane上的正确坐标处添加,如下所示:


以上内容包括
图形2d
和渲染提示,即抗锯齿。仅针对一些外观更好的图形:)

g
是框架的图形上下文。现在,标题栏也是框架的一部分。因此,(0,0)表示框架的左上角,而不是预期的绘图区域的左上角。框架的装饰会占用框架范围内的空间。不建议直接在框架上喷漆,因为1。你遇到了这个问题和2。框架包含其他组件(内容窗格、菜单、图层和玻璃窗格)。查看更多信息。您应该使用自定义组件(如
JPanel
)并将其添加到内容窗格中,或者用它替换框架的内容窗格。“
。测试扩展JFrame..
”为什么要扩展框架?只需使用一个实例。+1和wthompson,@doorknoble也总是在事件分派线程上创建Swing组件,而不是调用setSize,而是调用
JFrame
上的
pack()
(并覆盖
JPanel
getPreferredSize()
——有关更多信息,请参阅我的答案)+1用于
paintComponent
JPanel
repaint()
建议。@AndrewThompson我只是试图使它尽可能与原始程序相似。我通常不会这么做。@Doorknob不要给出操作代码,因为他/她可能会认为这是正确的操作方法,因此学习了错误的方法,而应该为将来的IMO纠正错误。谢谢你帮了我很多忙,尽管我在乞讨中遇到了一些麻烦,但还是把它解决了(我在另一个项目中实施了这一点)
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.setColor(Color.blue);
                g.drawRect(0 + getInsets().left, 0 + getInsets().top, 200, 200);
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();
        frame.setVisible(true);
    }
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
                g2d.setColor(Color.blue);
                g2d.drawRect(0, 0, 200, 200);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }
}