teratail header banner
teratail header banner
質問するログイン新規登録
Java

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

Q&A

解決済

1回答

323閲覧

JAVAの画像とスクロールバーの表示がうまくいかない

YUUdesu

総合スコア5

Java

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

0グッド

0クリップ

投稿2023/08/29 15:31

0

0

実現したいこと

ウィンドウを作成したと同時に画像とスクロールバーを表示させる。

前提

eclipceでJAVAで大きい画像の表示とスクロール機能の実装をしたいのです。そこで以下のようなコードを実行しました。すると初めに作成されるウィンドウは真っ白で、そのウィンドウの大きさを変えた(最大表示など)したとたんに画像の表示とスクロールバーが表示されます。そうではなく実行した際に作られるウィンドウに画像の表示とスクロールバーを表示させたいです。

該当のソースコード

public class mine {

public static void main(String[] args) { Window test = new Window(); test.window("test", 600, 600); }

}

//以下ウィンドウ作成の作成と画像表示のためのクラス
import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class Window extends JFrame {

private String name;//ウィンドウの名前を入れる為の変数 private int x;//ウィンドウの大きさの横幅を入れる為の変数 private int y;//ウィンドウの大きさの立幅を入れる為の変数 public void window(String name,int x,int y){ this.name = name; JFrame window = new JFrame(name); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setSize(x,y); window.setVisible(true); JLabel label = new JLabel();//ラベルの作成 //画像の読み込み ImageIcon icon = new ImageIcon("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\とある壁紙.jpg"); label.setIcon(icon);//ラベルに画像を貼り付け JScrollPane scrollpane = new JScrollPane(label); Container contentPane = window.getContentPane(); contentPane.add(scrollpane, BorderLayout.CENTER);//パネルをウィンドウに貼り付け }

}

試したこと

ラベルやパネルの作成の順番を変えてみるなどは試してみたのですがうまくいきませんでした。しかし、このプログラムを書くにあたって参考にしたプログラムをコピペして試したところ上手くいきました。そのプラグラムと見比べてみたりしたのですが原因はよくわからなかったです。

プログラミング自体初心者で独学の為、もしかすると簡単なミスなのかもしれないですがわかる方いたらご教授願いたいです。
よろしくお願いします。

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

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

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

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

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

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

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

jimbe

2023/08/29 17:42

とりあえず、ソースコードは「コードのマークダウン」を用いてファイル毎にご提示ください。 ```java public class mine { : } ``` ```java import java.awt.BorderLayout; : public class Window extends JFrame { : } ```
guest

回答1

0

ベストアンサー

問題の動作は、コマンドラインのスレッドで JFrame を表示( setVisivle(true); ) 後にもまだ Swing のコンポーネントを弄っているためと思われます。
Swing で一度何かを表示させたら、コマンドラインのスレッド上でそれ以上処理をしてはいけないことになっています。

MainFrame.java

java

1import java.awt.BorderLayout; 2 3import javax.swing.*; 4 5public class MainFrame extends JFrame { 6 public static void main(String[] args) { 7 SwingUtilities.invokeLater(() -> new MainFrame("test",600,600).setVisible(true)); 8 } 9 10 public MainFrame(String name, int width, int height) { 11 super(name); 12 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 13 setSize(width, height); 14 15 //String filename = "C:\\Users\\Jimbe\\Pictures\\艦これ\\E5Colorado.jpg"; 16 String filename = "C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\とある壁紙.jpg"; 17 18 JLabel label = new JLabel(); 19 ImageIcon icon = new ImageIcon(filename); 20 label.setIcon(icon); 21 22 JScrollPane scrollpane = new JScrollPane(label); 23 add(scrollpane, BorderLayout.CENTER); 24 } 25}

ウインドウシステムはコマンドラインより格段に難しいです。
考え方を180度切り替える必要があるかもしれませんのでご留意ください。

投稿2023/08/29 18:00

編集2023/08/29 18:08
jimbe

総合スコア13357

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

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

YUUdesu

2023/08/30 13:28

ご指摘のようにsetVisible(true)を最後に記述することで解決しました! ちなみに載せてくださったプログラムの「SwingUtilities.invokeLater()」についても調べてみたら便利なメソッドみたいですね。勉強になりました。しかし、まだAPIなどを見ても具体的な使い方が分からなかったのでこれからまたいろいろ漁って勉強したいと思います。 ありがとうございました。
jimbe

2023/08/30 14:47 編集

元々私は SwingUtilities.invokeLater は使わず public static void main(String[] args) { new MainFrame("test",600,600).setVisible(true); } のような形で書いていました。 setVisible がここにあるのは、呼び出しが確実に最後になるように(コピペ等で setVisible の呼び出しが変な所に行かないように)です。 のですが、公式には SwingUtilities.invokeLater を使うようにとなっていたり lamda 式が出来て インターフェースの無名定義が簡単になりましたので、今は回答のような main メソッドを書いています。 SwingUtilities.invokeLater を使ってフレームを作るなら setVisible は最後で無くても大丈夫かもしれませんが…まぁ、全て準備が出来てから表示とした方が何かスッキリしているかもしれません。
YUUdesu

2023/08/31 13:35

とりあえずJAVAの基礎が終わったところで、とりあえず何か一つアプリケーションを作ろうと思ってるところなので、今後画面の移り替わりなどについてもやっていこうと思うのでまた参考にしたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問