0

次のコードをご覧ください

package java2D;

import java.awt.BasicStroke;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;
import java.awt.*;

public class Joins extends JFrame
{
    private JPanel centerPanel;

    public Joins()
    {   
        this.setLayout(new BorderLayout());
        this.add(createCenterPanel(),"Center");

        this.setSize(200,250);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private JPanel createCenterPanel()
    {
        centerPanel = new JPanel();
        //centerPanel.setLayout(new FlowLayout());

        Graphics g = centerPanel.getGraphics();

        Graphics2D g2d =  (Graphics2D)g;

        BasicStroke bs1 = new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL);
        g2d.setStroke(bs1);
        g2d.drawRect(15, 15, 80, 50);

        BasicStroke bs2 = new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
        g2d.setStroke(bs2);
        g2d.drawRect(125, 15, 80, 50);

        BasicStroke bs3 = new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        g2d.setStroke(bs3);
        g2d.drawRect(235, 15, 80, 50);


        return centerPanel;
    }

    public static void main(String[]args)
    {
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                new Joins();
            }
        });
    }
}

このコードはNullPointerExceptionを生成します。内にグラフィックを描画する必要がありcenterPanelます。Swingアプリケーションを開発するとき、私は通常、JFrame領域をJPanelの数に分割し、ここでもそれを実行しましたが、NullPointerExceptionが発生しました。

以下はエラーです

run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java2D.Joins.createCenterPanel(Joins.java:34)
    at java2D.Joins.<init>(Joins.java:17)
    at java2D.Joins$1.run(Joins.java:55)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 6 seconds)

助けてください!

4

4 に答える 4

3

使用しないでくださいgetGraphics。新しいJPanelを作成し、ペイント機能をpaintComponentメソッドに配置します。を呼び出すことを忘れないでくださいsuper.paintComponent(g)

于 2013-02-19T20:10:09.913 に答える
2

すでに指摘したように、それGraphics g = centerPanel.getGraphics();があなたの問題の原因です。

getGraphicsを使用してカスタムペイントを実行しないでください。せいぜいgetGraphics最後のペイントサイクルのスナップショットです、最悪の場合、まあ、あなたは最悪の結果を見てきました、それはnull

カスタムペイントを実行するには、(JPanelたとえばなどから)カスタムコンポーネントを作成し、そのpaintComponentメソッドをオーバーライドする必要があります(呼び出すことを忘れないでくださいsuper.paintComponet

詳細については、カスタムペイントの実行をご覧ください。

于 2013-02-19T20:12:35.870 に答える
1

間違いは次のとおりです。

Graphics g = centerPanel.getGraphics();

javadocsによると:

このコンポーネントのグラフィックスコンテキストを作成します。nullこのコンポーネントが現在表示できない場合、このメソッドが返されます。

たぶん、最初にフレームにを追加する必要があるので、使用したJPanel後は?JoinsgetGraphics()

于 2013-02-19T19:57:05.627 に答える
-1

何も表示されないため、getGraphics()はnullを返します。試す:

    centerPanel = new JPanel();
    JFrame frame = new JFrame();
    frame.add(centerPanel);
    frame.setVisible(true);
    centerPanel.setVisible(true);
于 2013-02-19T20:01:51.853 に答える