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

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

ただいまの
回答率

89.96%

色のついたPanelの上にLabelの配置

解決済

回答 2

投稿 編集

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

sobue

score 215

イメージ説明

public class Picross extends JFrame implements ActionListener {

    int[][] questionarray = new int[MASS][MASS];

    public Picross() {
        Board board = new Board();

        JPanel btnpanel = new JPanel();
        JButton btn = new JButton("問題選択");
        JButton answerbtn = new JButton("答え合わせ");

        JPanel labelpanel = new JPanel();
        JLabel label = new JLabel("テスト");

        // フォームの設定
        setTitle("ピクロス");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 問題選択ボタンの設定
        btn.addActionListener(this);
        btnpanel.add(btn);

        // ピクロスの数字を表示するラベルの設定
        board.add(labelpanel);
        labelpanel.add(label);

        // 答え合わせボタンの設定
        answerbtn.addActionListener(this);
        btnpanel.add(answerbtn);

        // ボタンの位置の設定
        add(btnpanel, BorderLayout.SOUTH);


        // ピクロスのボードの位置を設定
        add(board, BorderLayout.CENTER);


        // 全てをまとめる
        pack();
    }


ピクロスの要である数字をラベルにて出力したいのですが、boardに描いた絵に隠れてしまっているのか、うまくいきません。
btnpanelのところであれば表示されたのですが・・・。
お手数ですが、宜しくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • dsuzuki

    2016/06/06 11:57

    悩んでいるのは具体的にソースのどこでしょうか。
    メソッドselectQuestion内のファイル読み込み処理?

    キャンセル

  • dsuzuki

    2016/06/10 12:16

    描画している(Boardの)コードがないとどんな描画をしているかわからないため、助言が出来ません。質問変更前のコードのままでしょうか。

    キャンセル

  • sobue

    2016/06/10 15:01

    質問変更前と同じです

    キャンセル

回答 2

+2

JLabelを使用する必要性がないなら、GraphicsのdrowStringメソッドで文字列を描画することが出来ます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/10 15:02

    逆にグラフィックで描けるなら、ラベルとの違いとはなんでしょうか?

    キャンセル

  • 2016/06/10 17:16

    個人的意見ですが、他の部品とのレイアウトを調整したいならJLabel、単純に描くだけならGraphics、ですね。
    今回の件では、数字を表示する項目はJLabelとするのがわかりやすいと思いますが、元のソースコードでは全体をGraphicsで作成されているのでdrowStringを提案しました。

    キャンセル

  • 2016/06/11 19:52

    せっかく回答いただきましたが、今回はLabelにて出力したかったので今後の参考にさせていただきます。

    キャンセル

check解決した方法

+1

package newPicross;

import static newPicross.CommonConst.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

/*
 * 
 */
public class Picross extends JFrame implements ActionListener {

    int[][] questionarray = new int[MASS][MASS];
    JLabel[] sideLabels = new JLabel[MASS];
    JLabel[] verticalLabels = new JLabel[MASS];

    public Picross() {
        Board board = new Board();

        JPanel btnpanel = new JPanel();
        JButton btn = new JButton("問題選択");
        JButton answerbtn = new JButton("答え合わせ");

        JPanel sideLabelPanel = new JPanel();
        JPanel verticalLabelPanel = new JPanel();


        setLayout(null);
        board.setBackground(Color.WHITE);
        // フォームの設定
        setTitle("ピクロス");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 問題選択ボタンの設定
        btn.addActionListener(this);
        btnpanel.add(btn);

        //Labelを配置するためのPanelのセット(横)
        sideLabelPanel.setLayout(null);
        sideLabelPanel.setBounds(0,MARGIN+SIZE, MARGIN+SIZE, SIZE*(MASS-1));
        sideLabelPanel.setOpaque(false);
        add(sideLabelPanel);

        // ピクロスの数字を表示するラベルの設定(横)
        for(int i = 1;i < MASS;i++){
            sideLabels[i] = new JLabel();
            sideLabels[i].setBounds(5, (SIZE*(i-1)), MARGIN, SIZE);
            sideLabels[i].setText("test" + i);
            sideLabelPanel.add(sideLabels[i]);
        }

        //Labelを配置するためのPanelのセット(縦)
        verticalLabelPanel.setLayout(null);
        verticalLabelPanel.setBounds(MARGIN+SIZE,0, WI-MARGIN-SIZE, MARGIN+SIZE);
        verticalLabelPanel.setOpaque(false);
        add(verticalLabelPanel);

        // ピクロスの数字を表示するラベルの設定(縦)
        for(int i = 1;i < MASS;i++){
            verticalLabels[i] = new JLabel();
        }




        // 答え合わせボタンの設定
        answerbtn.addActionListener(this);
        btnpanel.add(answerbtn);

        // ボタンの位置の設定
        btnpanel.setBounds(0, 440, 440, 100);
        add(btnpanel);


        // ピクロスのボードの位置を設定
        board.setBounds(0, 0, WI, HI);
        add(board);


        // 全てをまとめる
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equals("問題選択")) {
            // 問題選択ボタン

            // 問題を選択する
            selectQuestion();
        } else if (e.getActionCommand().equals("答え合わせ")) {
            // 答え合わせボタン
        }
    }

    private void selectQuestion() {

        int x = 1;
        int y = 1;

        JFileChooser fileChooser = new JFileChooser();
        // OpenDialogを表示させる
        int selected = fileChooser.showOpenDialog(this);

        // 開くを選択した場合
        if (selected == JFileChooser.APPROVE_OPTION) {
            try {
                FileReader fileReader = new FileReader(fileChooser.getSelectedFile());
                BufferedReader bufferedReader = new BufferedReader(fileReader);

                String line;
                StringTokenizer token;

                while ((line = bufferedReader.readLine()) != null) {
                    token = new StringTokenizer(line, ",");
                    while (token.hasMoreTokens()) {

                        if (token.nextToken().equals("1")) {
                            questionarray[x][y] = 1;
                        } else {
                            questionarray[x][y] = 0;
                        }

                        if (x == MASS - 1) {
                            x = 1;
                            y++;
                        } else {
                            x++;
                        }
                    }
                }
                bufferedReader.close();
                // 選択したファイルを読み込む
            } catch (Exception e2) {
                // TODO: handle exception
            }
        }

        // 縦の読み込み
        vertical();
        // 横の読み込み
        side();
    }

    private void side() {

        int shaveCount = 0;
        String shaveString = "";

        for (int y = 1; y < MASS; y++) {
            for (int x = 1; x < MASS; x++) {

                if (questionarray[x][y] == 1) {
                    shaveCount++;
                } else {
                    if (shaveCount > 0) {

                        shaveString = shaveString.trim() + shaveCount + " ";
                        shaveCount = 0;
                    } else {
                        shaveString = shaveString.trim() + " ";
                        shaveCount = 0;
                    }

                }
                if (x == MASS - 1) {
                    if (shaveString.trim().length() == 0) {
                        sideLabels[y].setText("0");
                    } else {
                        sideLabels[y].setText(shaveString);
                    }
                    shaveString = "";
                }
            }
        }

    }

    private void vertical() {

    }

    /**
     * 
     * ピクロスの盤面
     *
     */
    static class Board extends JLayeredPane implements MouseListener {

        int[][] boardarray = new int[MASS][MASS];

        public Board() {
            setPreferredSize(new Dimension(WI, HI));
            addMouseListener(this);

        }

        public void paint(Graphics graphi) {

            graphi.setColor(Color.WHITE);
            // ボードの下地を描く
            graphi.fillRect(0, 0, HI, WI);

            graphi.setColor(Color.BLACK);
            // ピクロスのマスの線を引く
            for (int i = 1; i <= MASS; i++) {
                // 横線
                graphi.drawLine(0, i * SIZE + MARGIN, WI, i * SIZE + MARGIN);
                // 縦線
                graphi.drawLine(i * SIZE + MARGIN, 0, i * SIZE + MARGIN, HI);
            }

            // 削った場所と戻した場所と削ってはいけない場所の色付け
            for (int x = 1; x < MASS; x++) {
                for (int y = 1; y < MASS; y++) {

                    if (boardarray[x][y] == SHAVED) {
                        // 削った場所
                        graphi.setColor(Color.BLACK);
                        graphi.fillRect(x * SIZE + MARGIN, y * SIZE + MARGIN, SIZE, SIZE);

                    } else if (boardarray[x][y] == BANSHAVED) {
                        // 削ってはいけない場所
                        graphi.setColor(Color.RED);
                        graphi.drawLine(x * SIZE + MARGIN, y * SIZE + MARGIN, (x + 1) * SIZE + MARGIN,
                                (y + 1) * SIZE + MARGIN);
                        graphi.drawLine(x * SIZE + MARGIN, (y + 1) * SIZE + MARGIN, (x + 1) * SIZE + MARGIN,
                                y * SIZE + MARGIN);

                    } else {
                        // 元に戻した場所
                        graphi.setColor(Color.WHITE);
                    }

                }
            }
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO 自動生成されたメソッド・スタブ

        }

        @Override
        public void mousePressed(MouseEvent e) {

            int x = (e.getX() - MARGIN) / SIZE;
            int y = (e.getY() - MARGIN) / SIZE;

            if ((x > 0 && y > 0) && (x < MASS && y < MASS)) {

                if (e.getClickCount() == 1) {
                    // クリック時
                    if (boardarray[x][y] == 0) {
                        boardarray[x][y] = SHAVED;
                    } else {
                        boardarray[x][y] = INIT;
                    }

                } else if (e.getClickCount() == 2) {
                    // ダブルクリック時
                    boardarray[x][y] = BANSHAVED;
                }
                // 再描画する
                repaint();
            }

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO 自動生成されたメソッド・スタブ

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO 自動生成されたメソッド・スタブ

        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO 自動生成されたメソッド・スタブ

        }

    }

    public static void main(String[] args) {
        Picross board = new Picross();
        board.setVisible(true);
    }

}


setLayout(null);を入れることと
Boardの継承をPanelからJLayeredPaneにすることによって解決しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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