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

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

ただいまの
回答率

90.50%

  • Java

    13794questions

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

  • Javaアプレット

    37questions

    Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Java Appletについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 155

Lana1114

score 12

 前提・実現したいこと

Java Appletを使って色々な色や太さの線を描く

質問内容

色の指定に関してはなんの問題もないのですが、線の太さに問題があり、例えばthin(細い)を選択して線を書いた後にthick(太い)を選択して線を描こうとするとthinで書いた線までthickと同じ太さになってしまいます。選択した別々の太さで線を描きたいのですがどうしたらよろしいでしょう?

このサイトでの質問が初めてな上、プログラミング初心者なので、質問内容に至らぬ点が多くあるかも知れませんがそこも含めてご教示願えると幸いです。

 該当のソースコード

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.LinkedList;

@SuppressWarnings("serial")
public class FrameApp4 extends Frame implements WindowListener, ActionListener, MouseListener, MouseMotionListener{
    java.util.List<ColorPoint> events = new LinkedList<ColorPoint>();
    Canvas canvas;
    Color color = Color.black;
    int Fontweight = 0;

    public static void main(String[] args) {
        FrameApp4 frame = new FrameApp4();
        frame.init();
        frame.setSize(200, 240);
        frame.addWindowListener(frame);
        frame.setVisible(true);
    }

    public void init() {
        setLayout(new BorderLayout());

        Panel panel = new Panel();
        {
            panel.setLayout(new FlowLayout());
            Button black = new Button("black");
            black.addActionListener(this);
            panel.add(black);
            Button red = new Button("red");
            red.addActionListener(this);
            panel.add(red);
            Button green = new Button("green");
            green.addActionListener(this);
            panel.add(green);
            Button blue = new Button("blue");
            blue.addActionListener(this);
            panel.add(blue);
            Button yellow = new Button("yellow");
            yellow.addActionListener(this);
            panel.add(yellow);
        }
        add(panel, BorderLayout.NORTH);

        Panel panel2 = new Panel();
        {
            panel2.setLayout(new FlowLayout());
            Button thin = new Button("thin");
            thin.addActionListener(this);
            panel2.add(thin);
            Button normal = new Button("normal");
            normal.addActionListener(this);
            panel2.add(normal);
            Button thick = new Button("thick");
            thick.addActionListener(this);
            panel2.add(thick);
        }
        add(panel2, BorderLayout.SOUTH);

        Panel panel3 = new Panel(); {
            Button clear = new Button("clear");
            clear.addActionListener(this);
            panel3.add(clear);
        }
        add(panel3, BorderLayout.WEST);

        canvas = new Canvas() {
            public void paint(Graphics g) {
                ColorPoint p = null;
                for (ColorPoint e : events) {
                    if (p != null && e != null) {
                        g.setColor(p.getColor());
                        Graphics2D g2 = (Graphics2D)g;
                        BasicStroke BStroke = new BasicStroke(Fontweight);
                        g2.setStroke(BStroke);
                        g2.drawLine(p.getX(), p.getY(), e.getX(), e.getY());
                    }
                    p = e;
                }
            }
        };
        canvas.addMouseListener(this);
        canvas.addMouseMotionListener(this);
        add(canvas, BorderLayout.CENTER);

        MenuBar mb = new MenuBar();
        {
            Menu file = new Menu("File");
            {
                MenuItem exit = new MenuItem("Exit");
                exit.addActionListener(this);
                file.add(exit);
            }
            mb.add(file);

            Menu color = new Menu("Color");{
                MenuItem black = new MenuItem("black");
                black.addActionListener(this);
                color.add(black);
                MenuItem blue = new MenuItem("blue");
                blue.addActionListener(this);
                color.add(blue);
                MenuItem red = new MenuItem("red");
                red.addActionListener(this);
                color.add(red);
                MenuItem green = new MenuItem("green");
                green.addActionListener(this);
                color.add(green);
            }
            mb.add(color);

            Menu fontweight = new Menu("Fontweight");{
                MenuItem thin = new MenuItem("thin");
                thin.addActionListener(this);
                fontweight.add(thin);
                MenuItem normal = new MenuItem("normal");
                normal.addActionListener(this);
                fontweight.add(normal);
                MenuItem thick = new MenuItem("thick");
                thick.addActionListener(this);
                fontweight.add(thick);
            }
            mb.add(fontweight);
        }
        setMenuBar(mb);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Exit")) {
            System.exit(0);
        }
        if (e.getActionCommand().equals("clear")) {
            events.clear();
            canvas.repaint();
        }
        if (e.getActionCommand().equals("black")) {
            color = Color.black;
        }
        if (e.getActionCommand().equals("red")) {
            color = Color.red;
        }
        if (e.getActionCommand().equals("green")) {
            color = Color.green;
        }
        if (e.getActionCommand().equals("blue")) {
            color = Color.blue;
        }
        if (e.getActionCommand().equals("yellow")) {
            color = Color.yellow;
        }
        if (e.getActionCommand().equals("thin")) {
            Fontweight = 1;
        }
        if (e.getActionCommand().equals("normal")) {
            Fontweight = 3;
        }
        if (e.getActionCommand().equals("thick")) {
            Fontweight = 6;
        }

    }

    public void mousePressed(MouseEvent e) {
        events.add(new ColorPoint(e.getX(), e.getY(), color, Fontweight));
        canvas.repaint();
    }

    public void mouseReleased(MouseEvent e) {
        events.add(null);
    }

    public void mouseDragged(MouseEvent e) {
        events.add(new ColorPoint(e.getX(), e.getY(), color, Fontweight));
        canvas.repaint();
    }

    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    public void mouseMoved(MouseEvent e) {}
    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void windowOpened(WindowEvent e) {}
    public void windowClosed(WindowEvent e) {}
    public void windowIconified(WindowEvent e) {}
    public void windowDeiconified(WindowEvent e) {}
    public void windowActivated(WindowEvent e) {}
    public void windowDeactivated(WindowEvent e) {}
}

class ColorPoint {
    int x, y;
    int Fontweight;
    Color color;

    public ColorPoint(int x, int y, Color color, int Fontweight) {
        this.x = x;
        this.y = y;
        this.color = color;
        this.Fontweight = Fontweight;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public Color getColor() {
        return color;
    }

    public int getFontweight() {
        return Fontweight;
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public void setFontweight(int Fontweight) {
        this.Fontweight = Fontweight;
    }
}

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

eclipse Oxygen.1a Release (4.7.1a)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/07/04 09:08

    既に解決されていますが、質問テンプレート部分の文言が多く残っています。質問内容や意図を読み取る上ではノイズにしかなりませんので、自身の質問に関係のある文章(およびソースコード)のみ残してください。

    キャンセル

  • Lana1114

    2018/07/04 11:17

    mts10806さんへ 一度修正をかけた際にテンプレート?を間違えて追加していたみたいです。ご指摘ありがとうございます。

    キャンセル

  • mts10806

    2018/07/04 11:18

    なるほど。ボタン1個で追加できてしまいますもんね。 解決後に細かい点、失礼しました。

    キャンセル

回答 1

checkベストアンサー

+1

例えばthin(細い)を選択して線を書いた後にthick(太い)を選択して線を描こうとするとthinで書いた線までthickと同じ太さになってしまいます。

このような時は、変数の指定を誤っている or 同じ変数を指定してる場合が多いので、その観点で質問文のコードを見ます。

                        BasicStroke BStroke = new BasicStroke(Fontweight); // ←ここ
                        g2.setStroke(BStroke);

原因はこの部分です。Fontweightではなく、e.getFontweight()としてくださいな。

余談ですがこのコードはApplet及びJAppletを継承していないのでJava Appletではなく、Java AWT のコードかと。


2018/07/03追記

Java AppletとJava AWTの違い・関係性について

Wikipediaを見るのが一番わかり易いと思います。
Javaアプレット
Abstract Window Toolkit

どちらも20年以上前の古い技術(Javaアプレットは廃止予定)なので、
差し迫った理由が無ければ今から覚えるのはお勧め致しません。
覚えるならばJava FXJava Swing(こちらも古いですが)もしくはJavaをやめてC#など。

参考までに簡易判定方法を記載します。

名前 extends部分
Javaアプレット Applet または JApplet
AWT Frame
Swing JFrame
FX Application

今回の質問文のコードはclass FrameApp4 extends Frameと宣言しているので、Java AWTです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/03 21:36 編集

    umyuさんありがとうございました。

    「このような時は、変数の指定を誤っている or 同じ変数を指定してる場合が多いので、その観点で質問文のコードを見ます。」
    なるほどですね。これから正しく動かない場合はこの点に注目して修正していこうと思います。

    「あとこのコードはApplet及びJAppletを継承していないのでJava Appletではなく、Java AWT のコードかと。」

    これに対しての質問なのですがJava AppletとJava AWTの違い・関係性についてもお教え願いますでしょうか?

    最後に、改めて質問内容の修正点及びプログラム内容についての質問の回答と何から何までありがとうございました。

    追記
    Wikipediaを見てきました。
    Java Applet自体が廃止予定なことも今知りました。

    こんな未熟者相手にとてもわかりやすいご説明ありがとうございました

    キャンセル

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

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

関連した質問

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

  • Java

    13794questions

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

  • Javaアプレット

    37questions

    Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。