2016-03-19 18 views
-1

Bir iletişim kutusu oluşturan bir program yapmaya çalışıyorum, asal numaralar ise ilk n numaralarını (aşağıdaki kodda int tarafından belirtilen) denetler ve sonra yazdırır böyle penceresine çıktı: doğru 3 - - Gerçek 4 - Yanlış 5 - - 2 GerçekLive-update, dinamik içerik pencereleri Java

1 vs Gerçek

...

Dinamik ve canlı (yani canlandırıcı) nasıl yapılacağını bulmakta zorluk çekiyordum ama başka bir forumdaki bir kişi Jlist kullanarak ve içerik olarak ayarladı ve ben de (aşağıda görebileceğin gibi) bunu yapabildim, ama ...

  1. Pencere yaklaşık 700x700 değil ve liste de değil.
  2. Liste boş ya da en azından ben öyle düşünüyorum, çünkü tüm aldığım varsayılan boyutta bir pencere ve tek içerik olarak beyaz bir çizgi.

Kodu:

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

ama onlarla hiçbir şey yapıyoruz, böylece hiçbir şey gösterecektir:

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

Ana hesaplamalarınız devam ederken Swing GUI güncellemesine sahip olmak için, hesaplamaları bir arka plan iş parçacığında çalıştırmanız gerekir. Bunun yerine, tüm hesaplamalarınızı yapmak, String sonuçlarını JList modeline kaydetmek (yaptığınız bir şey değil - sadece döndüğünüz String'i göz ardı edersiniz) ve daha sonra tüm hesaplamalar yapıldığı zaman daha kolay olurdu. senin JListin. Daha basit bir rotaya giderseniz, yine de oluşturduktan sonra NumberStr değişkeninizle bir şeyler yapmanız gerekir - bunu JList modelinize eklemeniz gerekir. Yani, bir DefaultListModel 'nesnesini oluşturun ... –

+0

... JList'inizi oluşturmak için kullanın (model nesnesini JList yapıcısına aktarın) ve her yeni bir numbertr değişkeni oluşturduğunuzda, modele ekleyin. “addElement (...)” yöntemini kullanarak. –

cevap

1

Burada Dizeleri yaratıyoruz.

, öyleyse JList kullanmak istiyorum:

  • yeni numara Dizeleri oluşturarak, onları modele ekleyin: Tüm hesaplamalar yapıldıktan sonra model.addElement(numberStr);
  • En GUI görüntülemek için.
  • JList'i bir JScrollPane öğesine
  • görüntülemeden önce ekleyin. Yaptığınız sırada iki JOptionPanes oluşturmayın (ve yanlış olanı görüntülüyorsunuz).
  • JList'in boyutunu kısıtlamayın. Bunun yerine satır sayısını kısıtlayın.
  • GUI'yi ilk kez görüntülemek ve uzun süren kodla güncellemek istiyorsanız, hesaplamayı yapmak için ayrı bir iş parçacığı kullanmak zorunda kalacaksınız ve sonucu dikkatle modele sıralamak zorunda kalacaksınız. Swing olay iş parçacığı üzerinde. Bunu yapmak istediğine emin misin? Ayrıca

Not

  • if (isPrime(z) == true){ basit if (isPrime(z)) {
  • Tüm değişkenler, bir küçük harf ile başlamalıdır olmalıdır numberStr değil NumberStr yüzden.

Anahtar while döngüsüdür - Orada oluşturulan dizeleri depolamak gerekir:

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

Daha da iyisi:

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

Oldukça derken ne demek istediğine bilmiyorum " im onlarla hiçbir şey yapmadan" ... Ben bir model oluşturulur ve burada içine Numstr ekledik:

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

Ben değil miyim?

+0

Evet, benim hatam, şimdi modeli görüyorum, ama bahsettiğim şey while döngüsündedir - while döngüsünde oluşturulan String nesneleriyle hiçbir şey yapmazsınız. –

+0

sonraki düzeltmeyi görmek için bkz. –

+0

Yanıtlamak için diğer düzenlemelere bakın. Hatanız sanırım liste modeline boş bir String ekliyorsunuz ve while döngüsünde String değişkeninin başvurduğu String'i değiştiriyorsunuz - ancak bu orijinal String’te hiçbir etkisi yok. liste modeline eklendi - hala boş. Bu, değişkenler ve nesneler arasındaki temel farkı alır. Dize nesneleri değişmezdir ve değiştirilemez ve böylece String değişkeninizde + = her çağırdığınızda, yeni bir String yaratırsınız, ancak orijinal String nesnesi tekrar değişmez. –

İlgili konular