2011-08-29 38 views
6

Tôi có một chương trình chính, trong đó GUI dựa trên xoay và tùy thuộc vào một trong bốn trạng thái các phần tử GUI có các tham số khác nhau.Làm mới GUI bằng một chuỗi khác trong java (swing)

public class Frame extends JFrame implements Runnable { 
Status status = 1; 
... 
@Override 
public void run() { 
    switch (status) { 
     case 1: 
     ... 
     case 2: 
     ... 
} 

public void updateGUI(Status status) { 
    this.status = status; 
    SwingUtilities.invokeLater(this); 
} 

Và nếu tôi muốn làm mới GUI chỉ gọi cập nhậtGUI với thông số thích hợp và mọi thứ đều ổn. Nhưng chương trình cũng tạo ra một chuỗi bổ sung, mà sau khi xử lý các dữ liệu liên quan nên thay đổi chương trình chính GUI. Thật không may tôi không thể trong thread này gọi phương thức updateGUI (..).

Tôi biết rằng tôi có thể sử dụng invokeLater hoặc SwingWorker để làm mới nhưng có hơn 10 phần tử vì vậy tôi muốn sử dụng phương thức udpateGUI().

Tôi sẽ biết ơn vì bất kỳ gợi ý nào.

+0

Vui lòng xem câu trả lời về sự kiện & xe buýt sự kiện trong câu hỏi này: http://stackoverflow.com/questions/7131484/how-to-pass-the-message-from-working-thread-to -gui-in-java/7131574 # 7131574 –

+0

Tại sao bạn không thể gọi updateGUI từ chuỗi khác? Ngoài truy cập không đồng bộ vào biến trạng thái, tôi không thấy lý do tại sao bạn không thể sử dụng phương thức này từ chuỗi khác. –

+0

nếu tôi gọi Frame f = new Frame(); f.udpateGUI (..); sau đó tất nhiên không có gì happend. Làm cách nào khác tôi có thể gọi phương thức đó? – galica

Trả lời

7

Nếu bạn thực hiện các chủ đề status lĩnh vực an toàn, sau đó bạn có thể gọi trực tiếp từ chủ đề setStatus nền của bạn. Để làm cho trạng thái an toàn cho luồng, hãy đặt các thay đổi trong khối đồng bộ hóa và làm cho biến biến động để cập nhật trên các chủ đề khác trở nên hiển thị.

Ví dụ:

public class Frame extends JFrame implements Runnable { 
private volatile Status status = 1; 
... 
@Override 
public void run() { 
    switch (status) { 
     case 1: 
     ... 
     case 2: 
     ... 
} 

public void updateGUI(Status status) { 
    setStatus(status); 
    SwingUtilities.invokeLater(this); 
} 

private synchronized void setStatus(Status status) { 
    this.status = status; 
} 

Với những thay đổi này, bạn có thể gọi setStatus từ bất kỳ chủ đề nào.

16

Dưới đây là một đoạn mã nhỏ bạn có thể thêm vào một phương pháp để đảm bảo nó thực thi trong luồng GUI. Nó dựa trên isEventDispatchThread().

public void updateGUI(final Status status) { 
    if (!SwingUtilities.isEventDispatchThread()) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      updateGUI(status); 
     } 
    }); 
    return; 
    } 
    //Now edit your gui objects 
    ... 
} 
+0

cảm ơn, điều đó cũng hữu ích. – galica

Các vấn đề liên quan