2016-03-19 9 views
-1

Javaで動的コンテンツ・ウィンドウは、彼らが素数である場合(以下のコードではint型のyで指定された)最初のn個の番号をチェックして、印刷しますこのようなウィンドウへの出力: - 真の 2 - 真 3 - トゥルー 4 - 偽 5 -ライブ更新、私はダイアログを作成するプログラムを作成しようとしている

1真

等...

...私は悩み、それを動的にして生きる方法を考え出す(すなわちリフレッシュ)が、別のフォーラムで誰かが提案するJListを使用し、コンテンツとしてという設定があったが、私がやった(あなたは以下を参照することができますよう)が、

  1. ウィンドウは700×700程度ではなく、リストもそうではありません。私が得るすべてはデフォルトのサイズでウィンドウで、唯一のコンテンツとして白線ので、
  2. リストが空である、または少なくとも私はそう思います。

コード:

while (y<100){ 
    if (isPrime(z) == true){ 
     NumberStr += z + " true"; 
    } else { 
     NumberStr += z + " false"; 
    } 
    y++; 
    z++; 
} 

が、あなたは彼らと何もしないしているので、何も表示されません:

import javax.swing.JOptionPane; 
import java.awt.Dimension; 
import javax.swing.DefaultListModel; 
import javax.swing.JList; 

public class main { 

@SuppressWarnings("unused") 
public static void main(String[] args) { 
    //make new string jlist, add numstr to it, and set list as contents 
    of window. 

    String NumberStr = ""; 

    DefaultListModel<String> listModel = new DefaultListModel<>(); 
    listModel.addElement(NumberStr); 

    JList<String> list = new JList<>(listModel); 

    JOptionPane Window = new JOptionPane(); 
    JOptionPane.showMessageDialog(Window, list, "Prime Number Generator", 
    JOptionPane.CANCEL_OPTION); 
    Window.setPreferredSize(new Dimension(700,700)); 
    list.setPreferredSize(new Dimension(100, 100)); 
    Window.setVisible(true); 
    //check if prime, append, update 
    int y = 0; 
    int z = 0; 
    while (y<100){ 
     if (isPrime(z) == true){ 
      NumberStr += z + " true"; 
     } else { 
      NumberStr += z + " false"; 
     } 
     y++; 
     z++; 
    } 
} 

public static boolean isPrime (int x){ 
    int i = 1; 
    boolean result = false; 
    while (i<=x){ 
     if (i%x<0) { 
      result = true; 
     }else{ 
      result = false;; 
     } 
     i++; 
     } 
    return result; 
    } 
} 
+0

スウィングGUIをプライム計算として更新するには、バックグラウンドスレッドで計算を実行する必要があります。代わりに、すべての計算を行う方がはるかに簡単で、String結果をJListのモデルに保存します(何もしていないもの - 返されたStringを無視するだけです)。すべての計算が完了したら、あなたのJList後者の方が簡単な場合は、作成したNumberStr変数で何かを行う必要があります.JListのモデルに追加する必要があります。したがって、 'DefaultListModel 'オブジェクトを作成してください... –

+0

...あなたのJList(JListのコンストラクタにあなたのモデルオブジェクトを渡します)を作成するためにそれを使用し、新しいnumberStr変数を作成するたびにモデルに追加します'addElement(...)'メソッドを使用します。 –

答えて

1

現在地文字列を作成しています。

あなたはその後、JListのを使いたい:

  • あなたの新しい番号の文字列を作成する場合は、モデルに追加します:すべての計算が行われた後、GUIを表示することがmodel.addElement(numberStr);
  • ベスト。
  • 表示する前にJListをJScrollPaneに追加します。
  • 2つのJOptionPaneを作成しないでください(間違った表示をしています)。
  • JListのサイズを制限しないでください。代わりに行数を制限します。
  • GUIを最初に表示して長時間実行するコードで更新したい場合は、別のスレッドを使用して計算を行う必要があり、結果を注意してモデルにキューイングする必要がありますSwingイベントスレッドであなたはこれをしたいと思いますか?

も注意し、

  • if (isPrime(z) == true){は、すべての変数がnumberStr、ないNumberStrので、小文字で始めるべき
  • if (isPrime(z)) {単純でなければなりません。

キーは、whileループである - あなたがそこに作成した文字列を格納する必要があります。

while (y<100){ 
    if (isPrime(z)){ 
     model.addElement(z + " true"); 
    } else { 
     model.addElement(z + " false"); 
    } 
    y++; 
    z++; 
} 

さらに良いの:

import javax.swing.*; 

public class Foo { 
    public static void main(String[] args) { 

     DefaultListModel<String> listModel = new DefaultListModel<>(); 

     // get rid of this, doesn't help 
     // listModel.addElement(numberStr); 

     JList<String> list = new JList<>(listModel); 

     // don't restrict the list's size, rather set its row count 
     // list.setPreferredSize(new Dimension(100, 100)); 
     list.setVisibleRowCount(10); 

     // check if prime, append, update 
     int y = 0; 
     while (y < 100) { 
      listModel.addElement(String.format("%d %b", y, isPrime(y))); 
      y++; 
     } 
     JOptionPane.showMessageDialog(null, new JScrollPane(list)); 
    } 

    // simplify 
    public static boolean isPrime(int x) { 
     int i = 2; 
     while (i < x) { 
      if (x % i == 0) { 
       return false; 
      } 
      i++; 
     } 
     return true; 
    } 
} 
0

私は非常にあなたがで何を意味するのか分かりません」イム彼らと何もしない」...私はモデルを作成し、ここにNumstrを追加しました:

DefaultListModel<String> listModel = new DefaultListModel<>(); 
listModel.addElement(NumberStr); 
JList<String> list = new JList<>(listModel); 

私はありませんか?

+0

はい、私の間違いですが、私は今モデルを見ていますが、私が話しているのはあなたのwhileループの中です。whileループ内で作成されたStringオブジェクトは何もしません。 –

+0

次を参照してください。 –

+0

編集するには編集を参照してください。あなたの間違いは、空のStringをリストモデルに追加し、whileループでString変数が参照するStringを変更していると思いますが、元のStringには影響しませんリストモデルに追加されました - まだ空白です。これは、変数とオブジェクトの中核的な違いになります。 Stringオブジェクトは変更不可能なので、String変数で+ =を呼び出すたびに新しいStringを作成しますが、元のStringオブジェクトは変更されません。 –

関連する問題