0

ここに GUI ウィンドウがあり、基本的にユーザーに JRadioButton を選択し、JTextField に何かを入力してから、確認/キャンセルを選択するよう求めます。

これは、UML から Java へのテキスト ファイルを作成するプロジェクトです。ユーザーはクラス情報を入力し、UML 関係を選択します。このプログラムは、JTextField に Java clsas テキストを出力する必要があります。Eclipseで新しいクラスを作成するときと同じです。

私がやりたいのは、boolean[] を作成してブール値の配列を格納することです。ユーザーが JRadioButton_A を選択すると true が格納され、ユーザーが JRadioButton_B を選択すると false が格納されます。また、JTextField に入力されたものをチェックする必要があります。メソッドが false を返した場合、文字列は ArrayList に格納されます。

以下は私のコードです - getName() メソッドと true と false を格納するための boolean[] にはいくつかの問題があります。ユーザーが名前を再度入力する必要がある場合、破棄された文字列/ブール値が配列に保存されます。(下手な英語でごめんなさい!) このプログラムを作る良い方法はありますか?物事を複雑にしているように感じます。もっと簡単な方法があるはずです。

これは、ユーザーにクラス情報を入力するように求める UI スタッフです。ユーザーは public/private を選択し、クラス名と JTextField を入力する必要があります

private class Handler implements ActionListener{
    public void actionPerformed(ActionEvent event){
        String name = inputClassName.getText();
        classObject.addName(name);
        while (classObject.checkName(name) == true){
            JOptionPane.showMessageDialog(null, "Class name invalid. " +
                    "\nEntered name should not contain java keywords or equal to other existing names. " +
                    "\nPlease try again."); // doesn't work
            name = inputClassName.getText();
            classObject.addName(name);
        }// end if
        JOptionPane.showMessageDialog(null, "Class saved."); // doesn't work
        name = inputClassName.getText();
        classObject.addName(name);

    }// end actionPerformed()
}// end Handler class

private class Handler2 implements ActionListener{
    public void actionPerformed(ActionEvent event){
        boolean b = true;
        b = classObject.setPP();
        }
    }

private class Handler3 implements ActionListener{
    public void actionPerformed(ActionEvent event){
        boolean b = false;
        b = classObject.setPP();
        }
    }

ArrayList および boolean[] への入力を格納するためのメソッドは次のとおりです。

Scanner input = new Scanner(System.in);
JavaKeywords keyObject = new JavaKeywords();

private ArrayList<String> className = new ArrayList<String>();
private String name = new String();
private int size = className.size();
private Boolean[] bArray = new Boolean[size];


public boolean checkName(String name){
    boolean check = true;
    for (int i=0; i<=size; i++){
        if (keyObject.containsKeyword(className.get(i)) || name.equals(className.get(i))){

            boolean o = false;
            check = o;
        }// end if
    }// end for
    return check;
}// end checkName
    
public boolean setPP(){
    boolean b = true;
    return b;
}

public void addPP(Boolean[] bArray){
    this.bArray = bArray;
    for (int i=0; i>=size; i++){
        bArray[i] = setPP();
    }
}// add a Array of boolean. for className[i], its class type = item[i] in bArray. 
             // public = true, private = false
public String getPublicPrivate(){
    String p = "";
    for (int i =0; i<=size; i++){
        if(bArray[i]=true)
            p = "public";
        else
            p = "private";
    }
    return p;
}

解決済み

解決策: string classNameandをクラスに保存boolean isPrivateし、クラスを にすると、ArrayListすべての問題を解決できます。しかし、その後、別の問題に直面しました。それはcheckName()、コードを変更した後に機能しないことです。ここはActionListener

private class Handler implements ActionListener{
    public void actionPerformed(ActionEvent event){
        
        VirtualClass virtualObject = new VirtualClass();
        classObject.addClass(virtualObject);
        String name = inputClassName.getText();
        virtualObject.className = name;
        
        if (classObject.checkName(name) == false){
            JOptionPane.showMessageDialog(null, "Class name invalid. " +
                    "\nEntered name should not contain java keywords or equal to other existing names. " +
                    "\nPlease try again."); // Always return "invalid" message 
        } else {
            JOptionPane.showMessageDialog(null, "Class saved."); 
            name = inputClassName.getText();
            virtualObject.className = name;
        }
        
        if (event.getSource() == publicButton) {
            virtualObject.isPrivate = false;
        } else if (event.getSource() == privateButton) {
            virtualObject.isPrivate = true;
        }

    }// end actionPerformed()

そしてここにcheckName()方法があります

public boolean checkName(String name){
    boolean check = true;
    for (int i=0; i<=size; i++){
        if (keyObject.containsKeyword(classes.get(i).className) || name.equals(classes.get(i).className)){
            boolean o = false;
            check = o;
        }// end if
    }// end for
    return check;
}// end checkName

containsKeyword()で、クラス名が有効かどうかを確認する方法のクラスcheckName()を使用しましたか? @MrLoreによる。JavaKeywords

4

2 に答える 2

1

おそらく、複数のリストをまったく使用する必要がないように、フィールドを表す単純なクラスを作成することになるでしょう。

public class VirtualClass {
    public boolean isPrivate;
    public String className = "Object";
}

ArrayList<VirtualClass> classes = new ArrayList<VirtualClass>(0);

public void addClass(VirtualClass clazz) {
    classes.add(clazz);
}

それ以外の場合は、パブリック/プライベートを保持するために、ある種の 2 番目のリストを作成する必要があります。それらを並行して変更するだけです。

// in actionPerformed

ClassObject.VirtualClass clazz = new ClassObject.VirtualClass();

clazz.isPrivate = rbPrivate.isSelected();
clazz.className = tfClassName.getText();

classObject.addClass(clazz);

クラスをリストに追加するまで、技術的にはラジオボタンの状態は必要ないため、ラジオボタンのリスニングは無視してください。

後でフィールドにアクセスするには、

for (VirtualClass clazz : classes) {
    System.out.println((clazz.isPrivate ? "private" : "public") + " " + clazz.className);
}

// or something like

for (int i = 0; i < classes.size(); i++) {
    System.out.println(classes.get(i).className + ":");
    if (classes.get(i).isPrivate) {
        System.out.println(" private");
    } else {
        System.out.println(" public");
    }
}
于 2013-10-23T20:13:38.667 に答える
0

私はあなたの全体的なアプローチに完全には納得していません。私が「すべき」/「可能性がある」と思うのは、ユーザーが求めるすべての情報を入力し、「同意する」を押し、ユーザーが入力した情報を有効にし、それが正しい場合は、それを表す新しいオブジェクトを作成することです。必要に応じてこの入力の結果。

個人的には、ブール値の配列を使用しないようにするか、少なくともそれらを別の方法で公開します。私が抱えている主な問題は、頭の中ですべてをまっすぐに保つことです.at要素は0実際にはどういう意味ですか?

代わりに、ClassName特定のプロパティを設定/取得できるクラスにゲッター/セッターを提供します。もちろん、内部で値を配列に保持することもできますが、クラスを使用する人は、これらの値をどのように格納するかを知る必要はありません。

チェック名の問題Handlerは、イベントディスパッチスレッドをブロックしているという事実ですwhile-loop

これにより、プログラムがユーザー入力に応答しなくなります (および描画自体も停止します)。

        while (classObject.checkName(name) == true){
            JOptionPane.showMessageDialog(null, "Class name invalid. " +
                    "\nEntered name should not contain java keywords or equal to other existing names. " +
                    "\nPlease try again."); // doesn't work
            name = inputClassName.getText();
            classObject.addName(name);
        }// end if

Swing はシングル スレッド フレームワークです。つまり、UI に対するすべての対話と変更は、EDT のコンテキスト内で実行されることが期待されます。同様に、このスレッドがイベント キューを処理するのをブロックまたは停止するものはすべて、再描画要求を含む新しいイベントへの応答を停止し、プログラムをハングさせます。

if-else代わりに、ステートメント内の名前を確認するだけです。有効な場合は新しいClassNameオブジェクトを作成し、そうでない場合はメッセージを表示してメソッドを終了させます。

詳細については、Swing の同時実行を確認してください。

于 2013-10-23T20:13:20.310 に答える