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

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

ただいまの
回答率

89.98%

図形が消えなくて困っています

解決済

回答 1

投稿

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

ba_max009

score 19

前提・実現したいこと

javaでメニューバーを作る課題をしているのですが、メニューバーの下のタグに表示した図形が消えなくて困っています![イメージ説明](2462f03f668ea34f16eab783f687694a.png)

何回かrepaint()をしているのですが図のように図形が重なってしまいます。
自分ではどこが悪いのかわからないので、見つけてもらえると幸いです!

長々とコードを書いてしまってすみません(><)

該当のソースコード

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;

import org.w3c.dom.css.Rect;

public class R10_2 extends JFrame {

JFrame app;
ArrayList<Figure>figs=new ArrayList();
Triangle t1 = new Triangle(Color.GREEN,100,100,30);
Rect r1 = new Rect(Color.RED,100,100,30,30);
Pentagon p1=new Pentagon(Color.ORANGE,100,100);
Figure sel=null;

public R10_2() {
//メニューバー作成
JMenuBar mbar = new JMenuBar(); setJMenuBar(mbar); 

//メニューを作成
JMenu m1 = new JMenu("ファイル"); mbar.add(m1);
JMenu m2 = new JMenu("形状"); mbar.add(m2);
JMenu m3 = new JMenu("大きさ"); mbar.add(m3);

//ファイルメニュー(メニューアイテム)の作成
m1.add("プログラムの終了").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.exit(0);
}
});
//形状メニュー(メニューアイテム)の作成
m2.add("三角").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
figs.add(t1); sel=t1;repaint();
}
});
m2.add("四角").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
figs.add(r1); sel=r1;repaint();
}
});
m2.add("五角").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
figs.add(p1); sel=p1 ;repaint();
}
});

//大きさメニュー
m3.add("大").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
sel.scale(60);repaint();
}
});
m3.add("中").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
sel.scale(30);repaint();
}
});
m3.add("小").addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
sel.scale(15);repaint();
}
});
JTabbedPane tabs = new JTabbedPane(); add(tabs);
tabs.add("表示", new JPanel() {
public void paintComponent(Graphics g){
setOpaque(false);
for(Figure f: figs){f.draw(g);repaint();}
}
});repaint();
}

interface Figure{
public void draw(Graphics g);
public void scale(int s);
}

class Triangle implements Figure{
Color col;
int rad;
int [] xs,ys;
int xpos,ypos;
double sqrt = Math.sqrt(3);
public Triangle(Color c,int x, int y,int r){
rad=r; col=c; xpos=x; ypos=y;
}
public void draw(Graphics g){
xs = new int []{xpos,(int)(xpos-rad*sqrt/2),(int)(xpos+rad*sqrt/2)};
ys = new int []{ypos-rad,ypos+rad/2,ypos+rad/2};
g.setColor(col); g.fillPolygon(xs, ys, 3);
}
public void scale(int s){ rad=s; }
}

class Rect implements Figure{
Color col;
int xpos,ypos,width,height;
public Rect(Color c, int x, int y, int w,int h){
col=c; xpos=x; ypos=y; width=w; height=h;
}
public void draw(Graphics g){
g.setColor(col);
g.fillRect(xpos-width/2, ypos-height/2, width, height);
}
public void scale(int s){width=s; height=s;}
}

static class Pentagon implements Figure{
Color col;
int xs[]= new int[5];
int ys[]= new int[5];
int r=30;
int x,y;
public Pentagon(Color c,int xpos,int ypos){
col=c; x=xpos; y=ypos;
}
public void scale(int s){r=s;}
public void draw(Graphics g){
for(int i=0; i<5; i++)
{   
xs[i]= x+(int)(Math.sin(i*3.14*2/5)*r);
ys[i]= y-(int)(Math.cos(i*3.14*2/5)*r);
}
g.setColor(col);
g.fillPolygon(xs, ys, xs.length);
}
}

public static void main(String[] args) {
JFrame app = new R10_2();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setPreferredSize(new Dimension(400, 300));
app.pack(); app.setVisible(true);
}
}

試したこと

repaintはしてみました。
もしかしたら書くタイミングがおかしいのかも知れませんが自分ではわかりませんでした…(><)

補足情報(言語/FW/ツール等のバージョンなど)

エクリプスを使っています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tsukka

    2016/07/06 19:33

    コードブロック</>を使用してくれると見やすくてうれしいです

    キャンセル

回答 1

checkベストアンサー

0

ArrayList<Figure> figsに対して、Figureをaddだけして、
clearもしくはremoveをしていないのが原因ではないでしょうか。
そのため、下記のコードでそれまで指定したすべてのFigureが再描画されます。

for (Figure f : figs) {
    f.draw(g);
    repaint();
}


図形を重ねる必要がないなら、上記コードを下記に変更してみてください。

if(sel != null) sel.draw(g);
repaint();

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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