質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

java:ボタンを押したら画像の色を三角形の形に塗りつぶしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,042

score 12

今回したいのは、ボタンを押したら読み取った画像の部分の色を三角形に塗りつぶしたいです。
ボタンを押す前は、三角錐の展開図を表示していて、ボタンを押したら上記のようにしたいです。
ソースは、以下に示します。
今は、三角錐の展開図の表示と画像を読み取る部分まではうまくできているのですが、塗りつぶすことができません。

  Color color[] = new Color[36];
    /*    色を抽出するための点の座標を定義している場所        */
    static int x[] = {205,260,320,390,440,265,320,380,320};
    static int y[] = {165,195,170,185,165,270,290,270,360};
    /*    三角を描画するための座標を定義している場所    */
    x1~x36,y1~y36は三角を塗りつぶすための座標
    BufferedImage imagehairetu[] = new BufferedImage[4];
    String F = "D:/workspace/KAIHATUU";
    FileInputStream z[];
    Boolean bool = Boolean.valueOf(true);
    public static void main(String[] args) {
        new irohannei().setVisible(true);
        }
    public irohannei(){
        super();
        setBounds(550,250,800,600);
        this.setTitle("色");
        File file = new File("rgby1.jpg");
        if(file.exists()){
            System.out.println("保存した画像があります");
            if(file.canRead()){
                System.out.println("画像を読み込めれれるよ!");
                for(int i=0;i<4;i++){
                    try {
                        imagehairetu[i] = ImageIO.read(file);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.out.println(i+"番目の要素:"+imagehairetu);
                } 
                System.out.println("画像を読みこんだよ!");
                System.out.println("配列に画像を入れたよ!");
                }else{
                System.out.println("画像を読み込めないよ!");
            }
        }else{
            System.out.println("画像がないよ!");
        }
        JButton button1 = new JButton("ボタン1");
        button1.setVisible(true);
        button1.setBounds(100, 100, 100, 100);
        button1.addActionListener(
                  new ActionListener(){
                    public void actionPerformed(ActionEvent event){    
                        String isStringBool = "true";
                        String str = bool.toString();
                        if(str.equals(isStringBool)){
                            System.out.println("1");//確認用
                    158行目    →    paintComponents(color);
                            System.out.println("2");//確認用
                        }
                    }
                    private void paintComponents(Color[] color) {
                        Graphics g = null;
                        System.out.println(imagehairetu[0]);
                        System.out.println(imagehairetu[1]);
                        System.out.println(imagehairetu[2]);
                        System.out.println(imagehairetu[3]);
                        System.out.println("1面の色データ格納完了!");
                        color[0] = new Color(imagehairetu[0].getRGB(x[0], y[0]));
                        color[1] = new Color(imagehairetu[0].getRGB(x[1], y[1]));
                        color[2] = new Color(imagehairetu[0].getRGB(x[2], y[2]));
                        color[3] = new Color(imagehairetu[0].getRGB(x[3], y[3]));
                        color[4] = new Color(imagehairetu[0].getRGB(x[4], y[4]));
                        color[5] = new Color(imagehairetu[0].getRGB(x[5], y[5]));
                        color[6] = new Color(imagehairetu[0].getRGB(x[6], y[6]));
                        color[7] = new Color(imagehairetu[0].getRGB(x[7], y[7]));
                        color[8] = new Color(imagehairetu[0].getRGB(x[8], y[8]));
                        System.out.println("2面の色データ格納完了!");
                        color[9] = new Color(imagehairetu[1].getRGB(x[0], y[0]));
                        color[10] = new Color(imagehairetu[1].getRGB(x[1], y[1]));
                        color[11] = new Color(imagehairetu[1].getRGB(x[2], y[2]));
                        color[12] = new Color(imagehairetu[1].getRGB(x[3], y[3]));
                        color[13] = new Color(imagehairetu[1].getRGB(x[4], y[4]));
                        color[14] = new Color(imagehairetu[1].getRGB(x[5], y[5]));
                        color[15] = new Color(imagehairetu[1].getRGB(x[6], y[6]));
                        color[16] = new Color(imagehairetu[1].getRGB(x[7], y[7]));
                        color[17] = new Color(imagehairetu[1].getRGB(x[8], y[8]));
                        System.out.println("3面の色データ格納完了!");
                        color[18] = new Color(imagehairetu[2].getRGB(x[0], y[0]));
                        color[19] = new Color(imagehairetu[2].getRGB(x[1], y[1]));
                        color[20] = new Color(imagehairetu[2].getRGB(x[2], y[2]));
                        color[21] = new Color(imagehairetu[2].getRGB(x[3], y[3]));
                        color[22] = new Color(imagehairetu[2].getRGB(x[4], y[4]));
                        color[23] = new Color(imagehairetu[2].getRGB(x[5], y[5]));
                        color[24] = new Color(imagehairetu[2].getRGB(x[6], y[6]));
                        color[25] = new Color(imagehairetu[2].getRGB(x[7], y[7]));
                        color[26] = new Color(imagehairetu[2].getRGB(x[8], y[8]));
                        System.out.println("4面の色データ格納完了!");
                        color[27] = new Color(imagehairetu[3].getRGB(x[0], y[0]));
                        color[28] = new Color(imagehairetu[3].getRGB(x[1], y[1]));
                        color[29] = new Color(imagehairetu[3].getRGB(x[2], y[2]));
                        color[30] = new Color(imagehairetu[3].getRGB(x[3], y[3]));
                        color[31] = new Color(imagehairetu[3].getRGB(x[4], y[4]));
                        color[32] = new Color(imagehairetu[3].getRGB(x[5], y[5]));
                        color[33] = new Color(imagehairetu[3].getRGB(x[6], y[6]));
                        color[34] = new Color(imagehairetu[3].getRGB(x[7], y[7]));
                        color[35] = new Color(imagehairetu[3].getRGB(x[8], y[8]));                        
                210行目    →    g.setColor(color[8]);
                        g.fillPolygon(x1, y1, 4);
                        g.setColor(color[5]);
                        g.fillPolygon(x2, y2, 4);
                        g.setColor(color[6]);
                        g.fillPolygon(x3, y3, 4);
                        g.setColor(color[7]);
                        g.fillPolygon(x4, y4, 4);
                        g.setColor(color[0]);
                        g.fillPolygon(x5, y5, 4);
                        g.setColor(color[1]);
                        g.fillPolygon(x6, y6, 4);
                        g.setColor(color[2]);
                        g.fillPolygon(x7, y7, 4);
                        g.setColor(color[3]);
                        g.fillPolygon(x8, y8, 4);
                        g.setColor(color[4]);
                        g.fillPolygon(x9, y9, 4);
                        /*2面*/
                        g.setColor(color[13]);
                        g.fillPolygon(x10, y10, 4);
                        g.setColor(color[12]);
                        g.fillPolygon(x11, y11, 4);
                        g.setColor(color[11]);
                        g.fillPolygon(x12, y12, 4);
                        g.setColor(color[10]);
                        g.fillPolygon(x13, y13, 4);
                        g.setColor(color[9]);
                        g.fillPolygon(x14, y14, 4);
                        g.setColor(color[16]);
                        g.fillPolygon(x15, y15, 4);
                        g.setColor(color[15]);
                        g.fillPolygon(x16, y16, 4);
                        g.setColor(color[14]);
                        g.fillPolygon(x17, y17, 4);
                        g.setColor(color[17]);
                        g.fillPolygon(x18, y18, 4);
                        /*3面*/
                        g.setColor(color[22]);
                        g.fillPolygon(x19, y19, 4);
                        g.setColor(color[21]);
                        g.fillPolygon(x20, y20, 4);
                        g.setColor(color[20]);
                        g.fillPolygon(x21, y21, 4);
                        g.setColor(color[19]);
                        g.fillPolygon(x22, y22, 4);
                        g.setColor(color[18]);
                        g.fillPolygon(x23, y23, 4);
                        g.setColor(color[25]);
                        g.fillPolygon(x24, y24, 4);
                        g.setColor(color[24]);
                        g.fillPolygon(x25, y25, 4);
                        g.setColor(color[23]);
                        g.fillPolygon(x26, y26, 4);
                        g.setColor(color[26]);
                        g.fillPolygon(x27, y27, 4);
                        /*4面*/
                        g.setColor(color[31]);
                        g.fillPolygon(x28, y28, 4);
                        g.setColor(color[30]);
                        g.fillPolygon(x29, y29, 4);
                        g.setColor(color[29]);
                        g.fillPolygon(x30, y30, 4);
                        g.setColor(color[28]);
                        g.fillPolygon(x31, y31, 4);
                        g.setColor(color[27]);
                        g.fillPolygon(x32, y32, 4);
                        g.setColor(color[32]);
                        g.fillPolygon(x33, y33, 4);
                        g.setColor(color[33]);
                        g.fillPolygon(x34, y34, 4);
                        g.setColor(color[34]);
                        g.fillPolygon(x35, y35, 4);
                        g.setColor(color[35]);
                        g.fillPolygon(x36, y36, 4);
                    }});
                    JPanel p = new JPanel();
                    JPanel p1 = new JPanel(){
                    public void paintComponent(Graphics g){
                        super.paintComponent(g);    
                        /*    抽出した色を三角の中に反映している場所    */
                        /*枠線*/
                        Graphics2D g2 = (Graphics2D)g;
                        BasicStroke stroke = new BasicStroke(3.5f);
                        g2.setStroke(stroke);
                        /*1面*/
                        g.drawPolygon(x1, y1, 4);
                        g.drawPolygon(x2, y2, 4);
                        g.drawPolygon(x3, y3, 4);
                        g.drawPolygon(x4, y4, 4);
                        g.drawPolygon(x5, y5, 4);
                        g.drawPolygon(x6, y6, 4);
                        g.drawPolygon(x7, y7, 4);
                        g.drawPolygon(x8, y8, 4);
                        g.drawPolygon(x9, y9, 4);
                        /*2面*/
                        g.drawPolygon(x10, y10, 4);
                        g.drawPolygon(x11, y11, 4);
                        g.drawPolygon(x12, y12, 4);
                        g.drawPolygon(x13, y13, 4);
                        g.drawPolygon(x14, y14, 4);
                        g.drawPolygon(x15, y15, 4);
                        g.drawPolygon(x16, y16, 4);
                        g.drawPolygon(x17, y17, 4);
                        g.drawPolygon(x18, y18, 4);        
                        /*3面*/
                        g.drawPolygon(x19, y19, 4);
                        g.drawPolygon(x20, y20, 4);
                        g.drawPolygon(x21, y21, 4);
                        g.drawPolygon(x22, y22, 4);
                        g.drawPolygon(x23, y23, 4);
                        g.drawPolygon(x24, y24, 4);
                        g.drawPolygon(x25, y25, 4);
                        g.drawPolygon(x26, y26, 4);
                        g.drawPolygon(x27, y27, 4);
                        /*4面*/
                        g.drawPolygon(x28, y28, 4);
                        g.drawPolygon(x29, y29, 4);
                        g.drawPolygon(x30, y30, 4);
                        g.drawPolygon(x31, y31, 4);
                        g.drawPolygon(x32, y32, 4);
                        g.drawPolygon(x33, y33, 4);
                        g.drawPolygon(x34, y34, 4);
                        g.drawPolygon(x35, y35, 4);
                        g.drawPolygon(x36, y36, 4);
            }
        };
        p1.setSize(new Dimension(800,600 ));
        p.setBackground(Color.white);
        //自分で場所を決めるためのnull
        p.setLayout(null);
        p1.setLayout(null);
        p.add(p1);
        p.add(button1);
        Container contentPane = getContentPane();
        getContentPane().add(p, BorderLayout.CENTER);
    }


エラーとしましては、
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at irohannei$1.paintComponents(irohannei.java:210) → g.setColor(color[8]);
at irohannei$1.actionPerformed(irohannei.java:158) → paintComponents(color);
として出ます。指摘お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dice142

    2018/11/06 10:54

    JavaとJavaScriptは別物です。関係がなければJavaScriptタグは外してください。

    キャンセル

  • KSwordOfHaste

    2018/11/06 11:04

    irohannei.javaの210行目、158行目がどの行なのか閲覧者にはわかりません。その行がどこなのかソースコード上にコメントなどで明記してください。

    キャンセル

  • yasu_abu7

    2018/11/06 11:08

    すいません、指摘されたところは改善しました。

    キャンセル

回答 1

0

Graphics g = null;

該当のpaintComponent()の初めに上のコードがあり、
以降gは何も代入されていないので、nullのままg.setColor()が呼び出されているので、
NullPointerExceptionが出ています。


paintComponent()は描画に関するメソッドですが、JComponentクラスもしくはそれを継承したクラスでオーバーライドすることで意味をなします。
ActionListenerのactionPerformed内で使うには、そのクラスのインスタンスのrepaint()を呼び出すことでできます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/06 11:56

    paintComponentはJComponentクラスを継承しているクラスに書きます。
    ActionListenerのactionPerformedメソッドではrepaint()を呼び出せば描画されるはずです。

    キャンセル

  • 2018/11/06 11:57

    なるほど!
    repaint()をよびだすのですね!
    すこし、やってみます。ありがとうございます!

    キャンセル

  • 2018/11/06 12:06

    回答に追記しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る