如果第一个coord 0,0,paint方法在jFrame外部绘制

时间:2013-01-06 15:19:38

标签: java swing jframe

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

import java.awt.Color;
import java.awt.Graphics;
public class TEST extends javax.swing.JFrame {

@Override
public void paint(Graphics g){
    super.paint(g);
    g.setColor(Color.blue);
    g.drawRect(8, 30, 200, 200);
    repaint();
}}

2 个答案:

答案 0 :(得分:3)

在框架中添加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);
        }
    }
}

另外,请勿在{{1​​}}中致电repaint();。这将导致无限循环并冻结整个程序。

答案 1 :(得分:2)

问题是您的paint(..)方法没有考虑JFrame Insets,而是getInsets调用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添加到paintComponent(Graphics g)并覆盖JPanel的{​​{1}},不要忘记调用super.paintComponent(g)作为重写方法中的第一个调用而不是在那里绘制(不要忘记覆盖getPreferredSize()并返回正确的Dimension以使JPanel符合其绘图/图形内容)此问题将不再持续,因为JPanel被添加到正确的co中 - contentPane 上的协议如下:

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

以上包括Graphics2D和RenderingHints,即抗锯齿。只是为了一些更好看的图纸:))