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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

Q&A

解決済

1回答

3721閲覧

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

ba_max009

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

0グッド

0クリップ

投稿2016/07/06 10:32

###前提・実現したいこと
javaでメニューバーを作る課題をしているのですが、メニューバーの下のタグに表示した図形が消えなくて困っていますイメージ説明

何回か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/ツール等のバージョンなど)
エクリプスを使っています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tignear

2016/07/06 10:33

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

回答1

0

ベストアンサー

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

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

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

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

投稿2016/07/06 10:52

dsuzuki

総合スコア1682

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問