Soru İşlem gerçekleştiğinde dinamik olarak JTextArea'yı yenileyin mi?


Arka planda işlem gerçekleştiği için bilgileri JTextArea üzerinden ekrana kaydeden çok basit bir Swing UI oluşturmaya çalışıyorum. Kullanıcı bir düğmeyi tıkladığında, her bir aramayı istiyorum:

textArea.append(someString + "\n");

UI'de hemen görünmek için.

Şu anda, JTextArea, tüm kayıt bilgilerini düğmeyi tıkladıktan sonra işlem tamamlanana kadar göstermez. Dinamik olarak yenilemeyi nasıl sağlayabilirim?


23
2018-03-10 08:23


Menşei




Cevaplar:


Uygulamamla aynı sorunu yaşadım. Bazı eylemleri gerçekleştiren ve sonuçları bir JTextArea çıktı veren bir "Çalıştır" düğmesi vardı. Bir iş parçacığı yöntemini çağırmak zorunda kaldım. İşte yaptım.

Yapılabilecek birkaç işlem düğmem var ve o belirli eylemi yürütmek için bir "Çalıştır" düğmesi. Validate denen bir hareketim var. Bu radyo düğmesini kontrol ettiğimde ve "Çalıştır" düğmesini tıkladığımda, validate () yöntemini çağırır. Bu yüzden ilk önce bu yöntemi Runnable'ı uygulayan bir iç sınıfa yerleştirdim.

class ValidateThread implements Runnable {
    public void run() {
        validate();
    }
}

Daha sonra bu iş parçacığını "Çalıştır" düğmesinin ActionListener bölümünde aradım.

runButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        // Some code checked on some radio buttons
        if(radioButton.isSelected()) {
            if(radioButton.getText().equals("VALIDATE")) {
               Runnable runnable = new ValidateThread();
               Thread thread = new Thread(runnable);
               thread.start();
            }
        }
    }

});

İşte bu kadar! Çıkış şimdi JTextArea'ya gönderilir.

Şimdi, JTextArea'nın metin ile aşağı kaydırılmayacağını göreceksiniz. Bu yüzden caret pozisyonunu ayarlaman gerek

textArea.setCaretPosition(textArea.getText().length() - 1);

Şimdi, JTextArea'ya veri eklendiğinde, her zaman aşağı kaydırılacaktır.


23
2018-03-10 12:57



Neden EventQueue.invokeLater (runnable) kullanmıyorsunuz? - Jonas Eicher
Mevcut olduğundan emin değilim - yorumunuz benim lol sonra 4 yıl oldu - Ascalonian


Bunu dene:

jTextArea.update(jTextArea.getGraphics());

32
2017-10-17 08:32



o mükemmel. Teşekkür ederim :) - olyanren
işe yaradı. Teşekkürler :) - sourabh pandey
Çalışır ve uygulanması çok kolaydır. En iyi cevap bu olmalı. - Nautilus


Diğerleri bunun gibi multithreading gerektirdiğini söylediler. Bir bak bakalım Swing'de Eşzamanlılık.

Bir çözüm, SwingWorker kullanarak işlemeyi uygulamak olacaktır. DoInBackground yöntemi işlemi gerçekleştirir ve yayınlama yöntemini argüman olarak eklenecek String ile çağırırsınız. SwingWorker, bir String argümanı almak ve metin alanına eklemek için süreç yöntemini geçersiz kılar.


4
2018-03-10 09:30





4 yıl önce yayınlanan bu soruya cevap verdiğim için üzgünüm, ama benim için çalışan başka bir çözüm var. Sadece güncellemek için işaretçiler kullandım JTextAreagibi:

//JScrollPane variable pane initialized with JTextArea area
//We will update area with new text
JTextArea temp = (JTextArea) pane.getViewPort().getView();
//new text to add
JTextArea c = new JTextArea();
c.append("text \n)";
//update through pointers
temp = c;
pane.validate();

1
2018-05-29 13:31





Bunun için çoklu okumaya ihtiyacınız olacak. Dalmaya hazır mısın?


0
2018-03-10 08:24



Şapkamı açtım. Yani evet. - digiarnie


Multithreading ise, bunu denemeniz gerekiyor! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/


0
2018-03-10 08:38