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

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

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

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

Q&A

解決済

2回答

630閲覧

javaのデザインパターン,Mediatorパターンの実行がうまくいかない

freeza

総合スコア4

Java

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

0グッド

0クリップ

投稿2022/02/17 05:36

現在,javaの勉強のため「Java言語で学ぶデザインパターン入門 第3版 結城浩 著」を用いて学習しているのですが,この本にあるMediatorパターンを実行しようとすると以下のようなエラーメッセージが出てしまいました. イメージ説明

このエラーにあったのが初めてでどのように対処すればよいか分からなかったためここで質問させていただきました.ソースコードは以下のようになっています.

java

1public interface Colleague{ 2 public abstract void setMediator(Mediator mediator); 3 4 public abstract void setColleagueEnabled(boolean enabled); 5}

java

1import java.awt.Button; 2 3public class ColleagueButton extends Button implements Colleague{ 4 private Mediator mediator; 5 6 public ColleagueButton(String caption){ 7 super(caption); 8 } 9 10 @Override 11 public void setMediator(Mediator mediator){ 12 this.mediator = mediator; 13 } 14 15 @Override 16 public void setColleagueEnabled(boolean enabled){ 17 setEnabled(enabled); 18 } 19}

java

1import java.awt.Checkbox; 2import java.awt.CheckboxGroup; 3import java.awt.event.ItemEvent; 4import java.awt.event.ItemListener; 5 6public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague{ 7 private Mediator mediator; 8 9 public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state){ 10 super(caption, group, state); 11 } 12 13 @Override 14 public void setMediator(Mediator mediator){ 15 this.mediator = mediator; 16 } 17 18 @Override 19 public void setColleagueEnabled(boolean enabled){ 20 setEnabled(enabled); 21 } 22 23 @Override 24 public void itemStateChanged(ItemEvent e){ 25 mediator.colleagueChanged(); 26 } 27}

java

1import java.awt.Color; 2import java.awt.TextField; 3import java.awt.event.TextEvent; 4import java.awt.event.TextListener; 5 6public class ColleagueTextField extends TextField implements TextListener, Colleague{ 7 private Mediator mediator; 8 9 public ColleagueTextField(String text, int columns){ 10 super(text, columns); 11 } 12 13 @Override 14 public void setMediator(Mediator mediator){ 15 this.mediator = mediator; 16 } 17 18 @Override 19 public void setColleagueEnabled(boolean enabled){ 20 setEnabled(enabled); 21 setBackground(enabled ? Color.white : Color.lightGray); 22 } 23 24 @Override 25 public void textValueChanged(TextEvent e){ 26 mediator.colleagueChanged(); 27 } 28} 29

java

1import java.awt.CheckboxGroup; 2import java.awt.Color; 3import java.awt.Frame; 4import java.awt.GridLayout; 5import java.awt.Label; 6import java.awt.event.ActionEvent; 7import java.awt.event.ActionListener; 8 9public class LoginFrame extends Frame implements ActionListener, Mediator{ 10 private ColleagueCheckbox checkGuest; 11 private ColleagueCheckbox checkLogin; 12 private ColleagueTextField textUser; 13 private ColleagueTextField textPass; 14 private ColleagueButton buttonOk; 15 private ColleagueButton buttonCancel; 16 17 public LoginFrame(String title){ 18 super(title); 19 20 setBackground(Color.lightGray); 21 22 setLayout(new GridLayout(4,2)); 23 24 createColleagues(); 25 26 add(checkGuest); 27 add(checkLogin); 28 add(new Label("Username:")); 29 add(textUser); 30 add(new Label("Password")); 31 add(textPass); 32 add(buttonOk); 33 add(buttonCancel); 34 35 colleagueChanged(); 36 37 pack(); 38 setVisible(true); 39 } 40 41 @Override 42 public void createColleagues(){ 43 CheckboxGroup g = new CheckboxGroup(); 44 checkGuest = new ColleagueCheckbox("Guest", g, true); 45 checkLogin = new ColleagueCheckbox("Login", g, false); 46 47 textUser = new ColleagueTextField("", 10); 48 textPass = new ColleagueTextField("", 10); 49 textPass.setEchoChar('*'); 50 51 buttonOk = new ColleagueButton("OK"); 52 buttonCancel = new ColleagueButton("Cancel"); 53 54 checkGuest.setMediator(this); 55 checkLogin.setMediator(this); 56 textUser.setMediator(this); 57 textPass.setMediator(this); 58 buttonOk.setMediator(this); 59 buttonCancel.setMediator(this); 60 61 checkGuest.addItemListener(checkGuest); 62 checkLogin.addItemListener(checkLogin); 63 textUser.addTextListener(textUser); 64 textPass.addTextListener(textPass); 65 buttonOk.addActionListener(this); 66 buttonCancel.addActionListener(this); 67 } 68 69 @Override 70 public void colleagueChanged(){ 71 if(checkGuest.getState()){ 72 textUser.setColleagueEnabled(false); 73 textPass.setColleagueEnabled(false); 74 buttonOk.setColleagueEnabled(true); 75 }else{ 76 textUser.setColleagueEnabled(true); 77 userpassChanged(); 78 } 79 } 80 81 private void userpassChanged(){ 82 if(textUser.getText().length() > 0){ 83 textPass.setColleagueEnabled(true); 84 if(textPass.getText().length() > 0){ 85 buttonOk.setColleagueEnabled(true); 86 }else{ 87 buttonOk.setColleagueEnabled(false); 88 } 89 }else{ 90 textPass.setColleagueEnabled(false); 91 buttonOk.setColleagueEnabled(false); 92 } 93 } 94 95 @Override 96 public void actionPerformed(ActionEvent e){ 97 System.out.println(e.toString()); 98 System.exit(0); 99 } 100}

java

1public interface Mediator{ 2 public abstract void createColleagues(); 3 4 public abstract void colleagueChanged(); 5}

java

1public class Main{ 2 public static void main(String[] args){ 3 new LoginFrame("Mediator Sample"); 4 } 5}

コンパイルは一応できていると思います.自分が使っていjavaのバージョンはjdk-17.0.2です.
何かわかる方がいらっしゃったらお願いします.

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

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

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

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

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

jimbe

2022/02/17 05:41

> コンパイルは一応できていると思います 「一応」とはどういうことでしょうか。 ワーニングはあるとかですか。
jimbe

2022/02/17 05:51 編集

Windows10 上の Eclipse では実行出来ています。 実行環境の問題が疑われます。
guest

回答2

0

「java.awt.headlessexception」で検索

HeadlessException(java8)
JFreChartでjava.awt.HeadlessException
等でしょうか。

なお
java.awt.headless=true でも重量コンポーネントは扱えない
という記事も見受けられます。

投稿2022/02/17 05:56

編集2022/02/17 05:57
jimbe

総合スコア12648

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

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

freeza

2022/02/17 06:32

ご返信ありがとうございます.記事を読んでどうやら扱っているものが重量コンポーネントであるため実行できないのかもしれないのだと思います.たくさんの記事を共有していただきありがとうございます.
guest

0

ベストアンサー

例外メッセージから察するに、ターミナル等でログインして実行しているのでしょう。顔なしで実行してみてはどうでしょうか。

java -Djava.awt.headless=true...

参考。 https://www.javainthebox.net/laboratory/JDK1.4/TinyTips/HeadlessSupport/HeadlessSupport.html

投稿2022/02/17 05:43

shiketa

総合スコア3971

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

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

freeza

2022/02/17 06:34

ご回答ありがとうございます.java -Djava.awt.headless=true Main と実行してみても同じようなエラーが出てしまいました.上の回答者さん(jimbeさん)の記事で重量コンポーネントはjava.awt.headless=trueでも扱えないというものがあったため,もしかしたら重量コンポーネントのため実行できないのかもしれません.
jimbe

2022/02/17 07:13

参考のリンク先の最後の一文も重量(=ヘビーウェイト)コンポーネントに関することですね。
shiketa

2022/02/17 07:31 編集

X11と出ていますので、Linux環境にソースを置いているのですよね。そして、rshかなにかで接続して実行しようとしている。 jimbeさんが試されたように、手元に開発環境を用意して実行することはできないのでしょうか。
freeza

2022/02/17 08:37

vscodeを使ってwslで動かそうとしていたのですが,何か別の開発環境を用意しないとダメなのかもしれないですね.
shiketa

2022/02/17 09:43 編集

wslだと、きっとGUI環境がありませんよね。X11の環境を用意できればいけるかもしれません https://dev.classmethod.jp/articles/wsl-x-window/ 。でも、まぁ、WindowsにJava環境を用意するほうが容易だとはおもいますが。
freeza

2022/02/18 12:01

windowsにjava環境を用意したら解決できました!ご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問