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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

1回答

3002閲覧

Java Swing  JLabelで表示する文章が重なって表示されてしまう

kmkr2221

総合スコア4

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/02/01 14:50

編集2022/01/12 10:55

前提・実現したいこと

イメージ説明
Java Swingでゲームのテキストのように文字を左から右に表示していくプログラムを考えています。
文章が最後まで表示される前にマウスをクリックすると文章を最後まで一気に表示し、その状態でもう一度クリックをすると次の文章が表示されるようにしたいです。
JPanelにJLabelをaddして、Timerとsubstring()を使ってsetTextで文章を表示しています。
他のクラスでボタンをクリックしたら該当のパネルが表示されるようにしています。

発生している問題・エラーメッセージ

しかし実行すると、一つ目の文章はうまく表示されますが、クリックして二つ目の文章を表示しようとすると、一つ目の文章の上に重なって表示されてしまいます。
どうしたらうまく表示することができるでしょうか?

該当のソースコード

Java

1コード 2import java.awt.BorderLayout; 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.Font; 6import java.awt.Graphics; 7import java.awt.Image; 8import java.awt.Toolkit; 9import java.awt.event.*; 10import javax.swing.Timer; 11import javax.swing.JLabel; 12import javax.swing.JPanel; 13 14public class Panel2 extends JPanel implements ActionListener,MouseListener { 15 JLabel label; 16 JPanel textPanel; 17 static int i=0; 18 static int j=0; 19 Timer timer; 20 String text[] = { 21 "やああああああああああああ", 22 "やるおおおおおおおおおおお"}; 23 Image img = Toolkit.getDefaultToolkit().getImage(画像のパス); 24 25 public void paintComponent(Graphics g) { 26 super.paintComponent(g); 27 g.drawImage(img, 0, 0, this); 28 } 29 30 public Panel2() { 31 addMouseListener(this); 32 setLayout(new BorderLayout()); 33 34 textPanel = new JPanel(); 35 textPanel.setBackground(new Color(0,0,0,100)); 36 37 label = new JLabel(); 38 label.setBackground(new Color(0,0,0,0)); 39 label.setFont(new Font("MS ゴシック", Font.BOLD, 20)); 40 label.setForeground(Color.YELLOW); 41 label.setPreferredSize(new Dimension(900,100)); 42 label.setOpaque(true); 43 44 textPanel.add(label); 45 add(textPanel,BorderLayout.NORTH); 46 47 timer = new Timer(50 , this); 48 timer.start(); 49 } 50 51 public void actionPerformed(ActionEvent e) { 52 String textC = text[j].substring(0,i); 53 if(i==text[j].length()) { 54 timer.stop(); 55 }else { 56 label.setText(textC); 57 i++; 58 } 59 } 60 61 public void mouseClicked(MouseEvent e) { 62 if(i!=text[j].length()) { 63 label.setText(text[j]); 64 timer.stop(); 65 i=text[j].length(); 66 }else if(i==text[j].length()) { 67 if(j==0) { 68 i=0; 69 j++; 70 timer.restart(); 71 }else if(j==1) { 72 timer.stop(); 73 System.exit(0); 74 } 75 } 76 } 77 public void mousePressed(MouseEvent e) { 78 } 79 public void mouseReleased(MouseEvent e) { 80 } 81 public void mouseEntered(MouseEvent e) { 82 } 83 public void mouseExited(MouseEvent e) { 84 } 85} 86

試したこと

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

Java version 13.0.2
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

label が不透明(isOpaque=true)の場合, label の背景となるパネル等は再描画されず, label が自身を背景色で塗り潰すことで消去されますが, その背景色が透明の為, 塗り潰せていないものと思います.
label および背景のパネルを透明とし, パネルのほうは透明でも背景色で塗り潰すようにしておくことで, ご希望の描画となると思います.

JPanel の代わりのクラスを追加

java

1 //半透明(可能)パネル追加 2 class JTranslucentPanel extends JPanel { 3 @Override protected void paintComponent(Graphics g) { 4 if(!isOpaque()) { 5 g.setColor(getBackground()); 6 g.fillRect(0,0,getWidth(),getHeight()); 7 } 8 super.paintComponent(g); 9 } 10 }

コンストラクタ内修正

java

1 label = new JLabel(); 2 //label.setBackground(new Color(0,0,0,0)); //不要 3 label.setFont(new Font("MS ゴシック", Font.BOLD, 20)); 4 label.setForeground(Color.YELLOW); 5 label.setPreferredSize(new Dimension(900,100)); 6 label.setOpaque(false); //true から変更 7 8 textPanel = new JTranslucentPanel(); //JPanel から変更 9 textPanel.setBackground(new Color(0,0,0,100)); 10 textPanel.setOpaque(false); //追加 11 textPanel.add(label); 12 add(textPanel,BorderLayout.NORTH);

投稿2020/02/01 20:06

編集2020/02/01 20:09
jimbe

総合スコア12543

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問