2011-01-05 13 views
5

olarak adlandırılır. 3 JComponents içeren bir ilerleme iletişim pencerem var: JLabel, JProgressBar, JButton, uygulamanın farklı bölümlerinde farklı iletişim pencereleri olarak kullanılır. İş Parçacığı. Bu yüzden, etiketin değerini değiştirmeye çalıştığımda, altındaki arkaplanı temizlemez, sadece eski olana yeni bir metin yazar. Sarmalayıcı sınıfı, içerdiği bileşenlere yöntem çağrıları gönderen tüm yöntemleri geçersiz kılmaz. İşteJLabel, eski metin üzerinde, ayarlanmış bir metin

kodudur:

public void setNote(String note) { 
     this.note = note; 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       label.setText(ProgressDialog.this.note); 
      } 
     }); 
    } 

gerçek sonuç http://www.daniweb.com/forums/post1073367.html#post1073367 benzer Ama bu çözüm benim için uygun değildi.

Böyle bir sorunla karşılaşan biri var mı?

Teşekkürler.

Bu, sınıfın kesilmiş sürümüdür. Ama dediğim gibi yanlış yapamadım. Bu yardımcı olur umarım.

public class Tesssst { 

    public static void main(String [] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     ProgressDialog dialog = new ProgressDialog(frame, "Title", "Message"); 
     dialog.showDialog(true); 

    } 
} 

class ProgressDialog extends JComponent { 
    /** 
    * 
    */ 
    private JProgressBar progressBar; 
    private JLabel label; 
    private JFrame parentComponent; 
    private String title; 
    private String note; 
    private boolean canceled; 
    private boolean cancelEnabled; 
    private JButton btnCancel; 
    private JPanel contentPanel; 

    public ProgressDialog(JFrame parentComponent, String title, String message) { 
     this.parentComponent = parentComponent; 
     this.title = title; 
     progressBar = new JProgressBar(); 
     label = new JLabel(); 
     contentPanel =new JPanel(); 
     canceled = false; 
     cancelEnabled = true; 
     setNote(message); 
     setOpaque(true); 

    } 
    public void setNote(String note) { 
     this.note = note; 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       label.setText(ProgressDialog.this.note); 
      } 
     }); 
    } 

    public String getNote() { 
     return note; 
    } 

    protected void initDialog() { 
     setBorder(new EmptyBorder(6, 6, 6, 6)); 
     contentPanel = new JPanel(); 
     contentPanel.setOpaque(true); 
     setLayout(new BorderLayout()); 
     add(contentPanel); 
     btnCancel = new JButton("Cancel"); 
     btnCancel.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       label.setText("ololo"); 
      } 

     }); 

     contentPanel.setLayout(new GridBagLayout()); 
     { 
     GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.fill = GridBagConstraints.NONE; 
      gbc.anchor = GridBagConstraints.NORTHWEST; 
      gbc.insets = new Insets(2, 0, 0, 0); 
      label.setOpaque(true); 
      contentPanel.add(label, gbc); 
     } // label 

     { 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      gbc.anchor = GridBagConstraints.NORTH; 
      gbc.weightx = 1; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.insets = new Insets(4, 0, 4, 0); 
      contentPanel.add(progressBar, gbc); 
     } // progressBar 

     { 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 2; 
      gbc.anchor = GridBagConstraints.NORTH; 
      gbc.fill = GridBagConstraints.NONE; 
      gbc.insets = new Insets(4, 0, 4, 0); 
      contentPanel.add(btnCancel, gbc); 
      btnCancel.setEnabled(cancelEnabled); 
     } // cancel*/ 
    } // funciton 

    public boolean isCanceled() { 
     return canceled; 
    } 

    public void showDialog() { 
     showDialog(false); 
    } 

    public void showDialog(boolean modal) { 
     JDialog dialog = new JDialog(parentComponent, true); 
     initDialog(); 
     dialog.getContentPane().add(contentPanel); 
     dialog.setSize(400,400); 
     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     if (modal) { 
      dialog.setAlwaysOnTop(true); 
     } 
     dialog.setVisible(true); 
     dialog.toFront(); 
    } 

    public void cancel() { 
     canceled = true; 
    } 

} 
+0

bir SSCCE gönderebilir miyim koymak gerekir? – jzd

+0

Üzgünüm. Açık biçimde çoğaltmaya çalıştım ama yapamadım. Anlıyorum ki, SSCCE olmadan bir şey söylemek çok zor, ama ben sadece bu problemle karşılaşıp karşılaşmadığını merak ediyordum. –

cevap

2

Sorun, opaklıktaydı. Bizim varsayılan görünüm ve hissediyorum "Panel.background" özelliği new Color(135, 15, 19, 0) olarak ayarlandı. Böylece tüm paneller varsayılan olarak opak değildi. repaint() yöntemi olarak adlandırılan etiket ve tüm ana paneller opak olmadığından arka plan yenilemesi gerçekleştirilmedi.

Yanıtlarınız için herkese teşekkürler.

2

metni ayarladıktan sonra belki yeterli bileşeni üzerinde bir repaint() deneyin.

+0

Teşekkürler, ama bunu denedim ve başarılı olmadı. –

+0

etiket yerine kapsayıcı/temel bileşen üzerinde denediniz mi? – dagnelies

+0

Evet, her ikisini de denedim –

3

Etiket üzerinde setOpaque(true)'u deneyin, bu arka planı temizlemesine neden olur.

+0

'un yukarısındaki kodlara bakın. Cevabınız için teşekkürler. Ne yazık ki bu bir çözüm değildir, çünkü yeni metin uzunluğu eskisinden daha az ise, son karakterleri temizlemez. –

+0

Öyleyse, aklıma gelen tek şey, pencerede repaint() öğesini çağırıyordu. – josefx

2

JComponent yerine JPanel'i genişletmeyi deneyin.

JComponent'in arka planını boyayacak herhangi bir kodu yoktur. Dolayısıyla, bileşen opak yapmak eski metni silmek için bir şey yapmaz. Etiketi opak tutmaz ve bileşeninizin kabı olarak opak bir JPanel kullanın.

Belki de arka planda bir alfa değeri olan arka planlar kullanıyorsunuzdur. Eğer öyleyse karşılaşabileceğiniz bazı problemler için Background With Transparency'u kontrol edebilirsiniz.

Aksi halde, farklı olanı görmek için çalışma kodunuzu çalışmayan kodla karşılaştırabilirsiniz.

+0

Hayır, bu sınıf hiyerarşisi ile bir anlaşma yapmadı –

1

Camickr'ın cevabı ilerlemek için doğru yoldur; Ancak testinizde açıkça yanlış olan bir şey salınan iplik kullanımınızdır.

Bir diyalog olmanın onunla ilgili bir şey olabileceğinden şüpheleniyorum. Dialoglar tipik olarak showDialog(); Böylece, ikinci bir olay dizisi genellikle showDialog() içinde oluşturulur. Burada anadan aradığınız bir SWMET'ten showDialog() çağırmıyorsunuzdur - belki bunun bazı garip etkileri görüyorsunuz.

public static void main(String args[]) throws Exception { 
SwingUtils.invokeLater(new Runnable() { 
public void run() { 
    ProgressDialog dialog = new ProgressDialog(frame, "Title", "Message"); 
    dialog.showDialog(true); 
} 
}); 
} 
+0

Teşekkürler, ama ben kendim anladım –

-2

Sen super.paintComponent(g);

İlgili konular