4

この場合の最初の座標は、8,30 ではなく 0,0 にする必要があります。私は何を間違っていますか (私は 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();
}}
4

2 に答える 2

4

フレームに を追加し、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();。これにより、無限ループが発生し、プログラム全体がフリーズします。

于 2013-01-06T15:24:51.313 に答える
3

問題は、あなたのメソッドがwhich as docs stateを呼び出すpaint(..)ことを考慮していないことです:JFrame InsetsgetInsets

このコンポーネントに境界線が設定されている場合、境界線のインセットを返します。

このコードは正常に動作します:

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

ただし、これはベスト プラクティスではありません。

むしろ、オーバーライドされたメソッドの最初の呼び出しとして dont forget call を追加してオーバーライドし、そこに描画します (オーバーライドして正しいJPanelsJFrameを返すことを忘れずに、 が描画/グラフィック コンテンツに適合するようにします) 。 contentPaneの座標を次のように修正します。paintComponent(Graphics g)JPanelsuper.paintComponent(g)getPreferredSize()DimensionJPanelJPanel

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、つまりアンチエイリアシングが含まれています。見栄えの良い図面のためだけに:)

于 2013-01-06T16:09:25.883 に答える