2017-12-05 36 views
0

ユーザーがJTextFieldのJFrameにデータを入力し、そのデータが別のクラスの変数に格納される生徒登録プログラムを作成しようとしています。 パッケージアグリゲーション;1つのJTextFieldから別のクラスの変数にテキスト入力を渡すにはどうすればよいですか?

import java.util.*; 
/** 
* 
* @author Frank 
*/ 
public class AcgRegistration { 


public static void main(String[] args) { 

    memberDialogBox memberDialogBox = new memberDialogBox(); 

} 

} 



    package acgregistration; 

    /** 
    * 
    * @author Frank 
    */ 
    class acgMember { 
private String name; 
private int num; 
private String email; 

public acgMember(String name, int number, String email) { 
    this.name = name; 
    this.num = number; 
    this.email = email; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getNum() { 
    return num; 
} 

public void setNum(int num) { 
    this.num = num; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 
} 



package acgregistration; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

/** 
* 
* @author Frank 
*/ 
public class memberDialogBox { 

String options[] = {"Student","Faculty/Staff"}; 
JComboBox choices = new JComboBox(options); 
JButton b = new JButton("Confirm"); 
JLabel l = new JLabel("Select your ACG Status"); 

public memberDialogBox(){ 
    frame(); 
} 

public void frame(){ 

    JFrame f = new JFrame(); 
    f.setVisible(true); 
    f.setSize(210,150); 
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    JPanel p = new JPanel(); 
    p.add(choices); 
    p.add(b); 
    p.add(l); 

    f.add(p); 

    b.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 


      String s = choices.getSelectedItem().toString(); 
      if ("Student".equals(choices.getSelectedItem())){ 

       studentDialogBox student = new studentDialogBox(); 
    //This code gives me an error code saying I should call 
    //acgMemberModel 


      } 
      else{ 
       facultyDialogBox faculty= new facultyDialogBox(); 
       } 

     f.dispose(); 
      } 

    }); 
    } 

} 


package acgregistration; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class studentDialogBox { 
private JTextField nameField = new JTextField("", 20); 
private JTextField emailField = new JTextField("", 20); 
private JTextField numberField = new JTextField("", 20); 
private JButton confirmButton = new JButton("Confirm"); 
private acgMemberModel model; 


public studentDialogBox(acgMemberModel model) { 
    this.model = model; 
    frame(); 
} 



public void frame() { 
    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setSize(400, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new JPanel(); 
    panel.add(nameField); 
    panel.add(emailField); 
    panel.add(numberField); 
    panel.add(confirmButton); 
    frame.add(panel); 

    confirmButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      String name = nameField.getText(); 
      String number = numberField.getText(); 
      String email = emailField.getText(); 
      acgMember member = new acgMember(name, 
    Integer.valueOf(number), email); 
      model.addNew(member); 
     } 
    }); 

    } 
} 

class acgMemberModel { 
private List<acgMember> members = new ArrayList<>(); 

public void addNew(acgMember member) { 
    members.add(member); 
} 

public List<acgMember> getMembers() { 
    return Collections.unmodifiableList(members); 
} 
} 

私は基本的にすべてのテキストフィールドに対してこれを行い、それをArrayListまたはHashmap(基本的に最終結果)に保存しようとしています。私の唯一の質問は、どのように私はテキストフィールドの入力を別のクラスに保存するのですか? ご協力いただければ幸いです!ありがとうございました!

答えて

0

フィールドを作成し、このアクションリスナーの結果のプッシュボタンを押すたびに、メンバーの新しいインスタンスを作成するだけで、テキストフィールドからすべてのデータを取得し、新しいインスタンスコンストラクタに渡します。新しいMemberを作成するたびに、それをMemberModelの別のクラスに渡します。

P.S.あなたは変数の名前が完全に無意味なので、ボタンの代わりにTextFieldにアクションリスナーを設定するために、あなたは間違ってJava言語の命名規則を読む必要があります。私はすべての変数名を人間が読める形式に変更する方法でコードをリファクタリングし、すべての規則が使用されていないため、私のソリューションで間違いを修正します。

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class Main { 

    public static void main(String[] args) { 
     MemberModel model = new MemberModel(); 
     StudentsToOutputListener outputListener 
       = new StudentsToOutputListener(model, new FileOutput(new File("path to your default file"))); 
     Window studentDialog = new StudentDialogBox(model); 
     Window facilityDialog = new FacultyDialogBox(); 
     Window memberDialog = new MemberDialogBox(studentDialog, facilityDialog); 
     memberDialog.show(); 
    } 
} 

class Member { 
    private String name; 
    private int number; 
    private String email; 

    public Member(String name, int number, String email) { 
     this.name = name; 
     this.number = number; 
     this.email = email; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Override 
    public String toString() { 
     return "Member{" + 
       "name='" + name + '\'' + 
       ", number=" + number + 
       ", email='" + email + '\'' + 
       '}'; 
    } 
} 

interface Window { 
    void show(); 
} 

interface Output { 
    void output(List<Member> members); 
} 

interface Listener { 
    void update(); 
} 

class MemberDialogBox implements Window { 
    private JFrame frame = new JFrame(); 
    private JComboBox<Window> choiceComboBox = new JComboBox<>(); 
    private JButton confirmButton = new JButton("Confirm"); 
    private JLabel selectLabel = new JLabel("Select your ACG Status"); 

    public MemberDialogBox(Window... windows) { 
     for (Window window : windows) { 
      choiceComboBox.addItem(window); 
     } 
     frame(); 
    } 


    public void show() { 
     frame.setVisible(true); 
    } 

    public void frame() { 
     frame = new JFrame(); 
     frame.setSize(210, 150); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     panel.add(choiceComboBox); 
     panel.add(confirmButton); 
     panel.add(selectLabel); 
     frame.add(panel); 

     confirmButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       Window window = (Window) choiceComboBox.getSelectedItem(); 
       window.show(); 
       frame.dispose(); 
      } 

     }); 
    } 

} 

class StudentDialogBox implements Window, Listener, Output { 
    private JTextField nameField = new JTextField("", 20); 
    private JTextField emailField = new JTextField("", 20); 
    private JTextField numberField = new JTextField("", 20); 
    private JButton confirmButton = new JButton("Confirm"); 
    private JButton saveButton = new JButton("Save students to file"); 
    private JFrame frame; 
    private JList<Member> list = new JList<>(); 
    private MemberModel model; 


    public StudentDialogBox(MemberModel model) { 
     this.model = model; 
     model.addListener(this); 
     frame(); 
    } 


    public void show() { 
     frame.setVisible(true); 
    } 


    public void output(List<Member> members) { 
     list.setListData(members.toArray(new Member[]{})); 
    } 


    public void update() { 
     model.outputStudentsTo(this); 
    } 

    public void frame() { 
     frame = new JFrame(); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     panel.add(nameField); 
     panel.add(emailField); 
     panel.add(numberField); 
     panel.add(confirmButton); 
     panel.add(list); 
     panel.add(saveButton); 
     frame.add(panel); 

     saveButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       JFileChooser fileChooser = new JFileChooser(); 
       fileChooser.showSaveDialog(frame); 
       File selectedFile = fileChooser.getSelectedFile(); 
       Output output = new FileOutput(selectedFile); 
       model.outputStudentsTo(output); 
      } 
     }); 

     confirmButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       String name = nameField.getText(); 
       String number = numberField.getText(); 
       String email = emailField.getText(); 
       Member member = new Member(name, Integer.valueOf(number), email); 
       model.addNewStudent(member); 
      } 
     }); 

    } 


    public String toString() { 
     return "Student"; 
    } 
} 

class FacultyDialogBox implements Window { 

    public void show() { 
     System.out.println("you need to implement FacultyDialogBox " + 
       "in similar way than StudentDialog box"); 
    } 


    public String toString() { 
     return "Faculty/Stuff"; 
    } 
} 


class MemberModel { 
    private List<Member> students = new ArrayList<>(); 
    private List<Member> stuff = new ArrayList<>(); 
    private List<Listener> listeners = new ArrayList<>(); 

    public void addListener(Listener listener) { 
     listeners.add(listener); 
    } 

    private void notifyListeners() { 
     for (Listener listener : listeners) { 
      listener.update(); 
     } 
    } 

    public void addNewStudent(Member member) { 
     students.add(member); 
     notifyListeners(); 
    } 

    public void addNewStuff(Member member) { 
     stuff.add(member); 
     notifyListeners(); 
    } 

    public void outputStudentsTo(Output output) { 
     output.output(Collections.unmodifiableList(students)); 
    } 

    public void outputStuffTo(Output output) { 
     output.output(Collections.unmodifiableList(stuff)); 
    } 
} 

class FileOutput implements Output { 
    private final File destination; 

    public FileOutput(File destination) { 
     this.destination = destination; 
    } 

    public void output(List<Member> members) { 
     try (BufferedWriter file = new BufferedWriter(new FileWriter(destination))) { 
      for (Member member : members) { 
       file.write(member.toString()); 
       file.write("\n"); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

class StudentsToOutputListener implements Listener { 
    private final MemberModel model; 
    private final Output output; 

    public StudentsToOutputListener(MemberModel model, Output output) { 
     this.model = model; 
     this.output = output; 
     model.addListener(this); 
    } 

    public void update() { 
     model.outputStudentsTo(output); 
    } 
} 

私はあなたに答えを更新するが、明確化を疑問視、また、私はこのコードをリファクタリングし、それよりOOPスタイルで、より読みやすく、しかし、あなたがすることによって実装する必要がある、あなたのプログラムを実施し、修正したいですかを理解します自分自身の第2のダイアログファシリティを生徒ダイアログボックスと同様に表示します。また、このソースのすべてのクラスを異なる* .javaファイルに配置する必要があります。

+0

ありがとうございます!選択されたときに生徒クラスを実行するアクションイベントリスナを持つJCombo Dialogクラスを作成しました。 - どうやって進めるのか分かりません。あなたは私にフィードバックを与えることができるように完全なコードを投稿できますか? – desperateundergrad

+0

@desperateundergrad、はいこれを更新するか、すでにここに紹介されているものとあまり関係がない場合は別の質問をして、私にリンクを提供してください – fxrbfg

+0

が更新されました!どうもありがとうございます! – desperateundergrad

-2

クラス間で共有する変数を作成しようとしましたか?public static

0

あなたはデータバインディングについて話しています。私は最近、この質問の答えとしてあなたが必要とするものを行う方法を示すデモを投稿しました:Switching JPanels moves content diagonally

本質的に、GUIは情報をモデルに渡し、その逆も同様のイベント、通常はプロパティ変更イベントですが、選択できるオプション。プロセスは次のようになります。

  1. ユーザーがフィールドフィールドは、それが
  2. GUI(またはコントローラクラスを)集中する失いプロパティ「値」のプロパティ変更イベントを発生させます
  3. に値を入力しますプロパティ変更イベントをリッスンし、Vetoable Change Eventなどの別のイベントを発生させます。
  4. モデル(またはコントローラ)は、Vetoableの変更をリッスンし、正しい場所に「状態」を保存して値を検証します。検証に失敗すると、例外が発生します。
  5. GUIは拒否例外をチェックし、必要に応じてフィールドを元に戻します。

同様のアプローチによって、モデルにプロパティ変更要求をGUIに送信してフィールドの値を更新させることができます。

これらのイベントを使用する利点は、GUIを簡単に保ち、モデルを表現から切り離し、GUIを簡単に別のテクノロジで置き換えたり複製したりすることが容易になることです。

関連する問題