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

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

ただいまの
回答率

90.38%

  • Java

    16468questions

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

国旗を表示させたい(続き)

解決済

回答 2

投稿 編集

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

coffeee

score 13

前提・実現したいこと

btn [0][1][2]をクリックすると、それに対応した国旗が表示されるようにしたい。

ソースコード

import java.awt.*; 
 import java.awt.event.*; 
 class  ColorButton extends Frame implements ActionListener{ 
     Button[] btn; 
         String[] ttl={"Germany","Indonesia","Romania","Exit"}; 
         final int N=4; 

     ColorButton(String s, int w, int h){ 
                 super(s); 
                 int i; 
                 setSize(w,h);

                btn=new Button[N]; 
                 for(i=0;i<N;i++){ 
                   btn[i]=new Button(ttl[i]); 
                   btn[i].addActionListener(this); 
                 } 
                 Panel p=new Panel(); 
                 for(i=0;i<N;i++)  p.add(btn[i]); 
                 p.setBackground(Color.pink); 
                 add(p,BorderLayout.SOUTH);

                addWindowListener(new WindowAdapter() 
                 { public void windowClosing(WindowEvent e){ 
                     System.exit(0);} 
                 }); 
     } 
     public void actionPerformed(ActionEvent e){ 
                 if(e.getSource()==btn[0]){ 

                 }else if(e.getSource()==btn[1]){ 

                 }else  if(e.getSource()==btn[2]){ 

                 }else{ 
                         System.exit(0); 
                 } 
     } 
                int radius=30,width=250,height=75;

       public void paint(Graphics g){

        g.setColor(Color.red);
        g.fillRect(30,60,width,height);

        g.setColor(Color.white);
        g.fillRect(30,130,width,height);
                g.setFont(f);
                g.setColor(Color.darkGray);
                g.drawString("Indonesia",50,240);

        width=width/3;height=height*2;
        g.setColor(Color.blue);
        g.fillRect(300,60,width,height);

        g.setColor(Color.yellow);
        g.fillRect(300+width,60,width,height);

        g.setColor(Color.red);
        g.fillRect(300+width*2,60,width,height);
        g.setFont(f);
        g.setColor(Color.darkGray);
        g.drawString("Romania",300,240);

        width=width*3;height=height/3;
        g.setColor(Color.black);
        g.fillRect(570,60,width,height);
        g.setColor(Color.red);
        g.fillRect(570,60+height,width,height);
        g.setColor(Color.yellow);
        g.fillRect(570,60+height*2,width,height);
        g.setFont(f);
        g.setColor(Color.darkGray);
        g.drawString("Germany",570,240);

      }

      public static void main(String[] args){ 
         ColorButton a=new ColorButton("National flag",300,200); 
         a.setVisible(true); 
     } 
 }

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

Javaです。よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • coco_bauer

    2016/01/14 16:44

    何が問題なのでしょうか? アプレットのプログラムと思われますが、import java.applet.Applet; import javax.swing.*;が見当たらないのは気になります。 また、アプレットの動作確認をする方法はご存知ですか? 確認に使うブラウザがjavaとappletの使用を許可しているか確認なさいましたか?

    キャンセル

  • coffeee

    2016/01/14 16:59

    コマンドプロンプトを用いてコンパイルする時点でエラーが出てしまいます。
    g.setfont(f); という箇所に対して「シンボルを見つけられません」と表示されます。

    キャンセル

  • coco_bauer

    2016/01/15 10:26

    graphicsオブジェクトのフォントを設定するメソッド名は、setFontです。setfontというメソッドは無いのでコンパイルエラーになっています(4文字目が小文字のfではなく、大文字のFが正しい)。javaは大文字/小文字を区別しますから、大文字/小文字も間違えないように注意してください。

    キャンセル

回答 2

checkベストアンサー

0

何が聞きたい、知りたいんでスカ
わたしがアドバイスするとしたら、jbutton を継承した国旗クラスを用意して処理を纏める。
座標とか指定せずに、レイアウトマネージャーのレイアウトに委ねる書き方に改める。
今より倍くらい長いソースになっちゃうけど、処理単位が纏まるのと同じような記述がへるので
読みやすくなります。
ーーーーーーーー追記
イメージ説明

package com.test.swing.util;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 画像ダウンロード先
 *  http://www.irasutoya.com/2012/05/asia.html
 *
 *   eclipseLuna 4.4 Java8 で動作確認済み
 *
 *   images/ フォルダを作りそこに上記無料画像のHPからダウンロードした画像を格納してください。
 *
 *   プログラムはimages/ フォルダにある画像ファイル分のボタンを生成、
 *   ボタン表示名に画像ファイル名を短縮した名称、ツールチップにフルパス、
 *   ボタンクリックすると画面中央にその国旗を表示します。
 */
public class FlagFrame extends JFrame implements ActionListener {

    /**
     *
     */
    private static final long serialVersionUID = -5353814936444576118L;

    public static void main(String[] args) {
        new FlagFrame(new File("images"));
    }

    public FlagFrame(File folderPath) {

        initLayout(folderPath);
    }

    private String cmd;

    private void initLayout(File path) {

        super.setLayout(new BorderLayout());

        List<File> files = new ArrayList<File>();

        for (File f : path.listFiles()) {
            files.add(f);
        }

        final int BUTON_NUM = 8;
        JPanel panel = new JPanel(new GridLayout((int)(files.size() / BUTON_NUM) + 1, BUTON_NUM));
        Random random = new Random();

        int max = files.size();
        for (int i=0;i < max;i++) {
            int r = random.nextInt(files.size());
            File oFile = files.get(r);

            String fileName = oFile.getName();
            if (fileName.length() > 5) {
                fileName = fileName.substring(0, 3) + "..." + fileName.substring(fileName.length() - 5);
            }
            JButton button = new JButton(fileName);
            button.addActionListener(this);
            button.setActionCommand(oFile.getAbsolutePath());
    //        button.setIgnoreRepaint(true);
            button.setToolTipText(oFile.getAbsolutePath());
            panel.add(button);
            System.out.println(oFile.toString());

            files.remove(r);
        }
        super.add(panel, BorderLayout.NORTH);

        JPanel renderPanel = new JPanel() {

            private static final long serialVersionUID = -3107296751372342247L;

            @Override
            public void paint(Graphics g) {

                if (cmd != null) {
                    ImageIcon imageIcon = new ImageIcon(cmd);

                    System.out.println("render: " + cmd);

                    g.drawImage(imageIcon.getImage(), 100, 100, null);

                    cmd = null;

                }
            }
        };
        super.add(renderPanel, BorderLayout.CENTER);

        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setSize(800, 600);
        super.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        cmd = button.getActionCommand();
        System.out.println("repaint target: " + cmd);
        super.repaint();
    }
}

ソース見難いじゃねーの、とか言っておきながら自分のも見難いですね;;;反省。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/14 16:43

    ご回答ありがとうございます。
    国旗クラスをまとめるにはどのように書けば良いのでしょうか?

    キャンセル

  • 2016/01/15 21:52

    画像を読み込ませて国旗を表示させるという手もあるのですね。
    勉強になりました。ありがとうございます!

    キャンセル

0

FlagFrame.java で保存。パッケージは適当に変更してください。画像とソース同時にあげたらソースだけなぜかトリミング?されたのでソースだけの書き込みをやりました。

package com.test.swing.util;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 画像ダウンロード先
 *  http://www.irasutoya.com/2012/05/asia.html
 *
 *   eclipseLuna 4.4 Java8 で動作確認済み
 *
 *   images/ フォルダを作りそこに上記無料画像のHPからダウンロードした画像を格納してください。
 *
 *   プログラムはimages/ フォルダにある画像ファイル分のボタンを生成、
 *   ボタン表示名に画像ファイル名を短縮した名称、ツールチップにフルパス、
 *   ボタンクリックすると画面中央にその国旗を表示します。
 */
public class FlagFrame extends JFrame implements ActionListener {

    /**
     *
     */
    private static final long serialVersionUID = -5353814936444576118L;

    public static void main(String[] args) {
        new FlagFrame(new File("images"));
    }

    public FlagFrame(File folderPath) {

        initLayout(folderPath);
    }

    private String cmd;

    private void initLayout(File path) {

        super.setLayout(new BorderLayout());

        List<File> files = new ArrayList<File>();

        for (File f : path.listFiles()) {
            files.add(f);
        }

        final int BUTON_NUM = 8;
        JPanel panel = new JPanel(new GridLayout((int)(files.size() / BUTON_NUM) + 1, BUTON_NUM));
        Random random = new Random();

        int max = files.size();
        for (int i=0;i < max;i++) {
            int r = random.nextInt(files.size());
            File oFile = files.get(r);

            String fileName = oFile.getName();
            if (fileName.length() > 5) {
                fileName = fileName.substring(0, 3) + "..." + fileName.substring(fileName.length() - 5);
            }
            JButton button = new JButton(fileName);
            button.addActionListener(this);
            button.setActionCommand(oFile.getAbsolutePath());
    //        button.setIgnoreRepaint(true);
            button.setToolTipText(oFile.getAbsolutePath());
            panel.add(button);
            System.out.println(oFile.toString());

            files.remove(r);
        }
        super.add(panel, BorderLayout.NORTH);

        JPanel renderPanel = new JPanel() {

            private static final long serialVersionUID = -3107296751372342247L;

            @Override
            public void paint(Graphics g) {

                if (cmd != null) {
                    ImageIcon imageIcon = new ImageIcon(cmd);

                    System.out.println("render: " + cmd);

                    g.drawImage(imageIcon.getImage(), 100, 100, null);

                    cmd = null;

                }
            }
        };
        super.add(renderPanel, BorderLayout.CENTER);

        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setSize(800, 600);
        super.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        cmd = button.getActionCommand();
        System.out.println("repaint target: " + cmd);
        super.repaint();
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/14 23:55

    「> 5」 は潜在バグですね、適当に直しておいてください。

    キャンセル

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

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

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

  • Java

    16468questions

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