2011-01-05 50 views
5

我有一個進度對話框窗口,其中包含3個JComponents:JLabel的,不確定JProgressBar,JButton的,這是在不同應用程序的不同部分使用的默認對話框窗口線程。所以當我嘗試更改標籤的值時,它不會清除它下面的背景,它只是在舊的背景上繪製新的文本。包裝類不會覆蓋它只是將方法調用委託給它所包含的組件的任何方法。JLabel的油漆覆蓋舊的新文本,設置文本被稱爲後

這裏是代碼:

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

實際的結果是類似於http://www.daniweb.com/forums/post1073367.html#post1073367 但這種解決辦法是不適合我。

有沒有人遇到這樣的問題?

謝謝。

這是類的cuted版本。但正如我所說,我不能讓它工作不正確。希望這可以幫助。

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

您可以發佈SSCCE嗎? – jzd 2011-01-05 18:25:19

+0

對不起。我試圖以清晰的形式複製它,但我不能。我明白,沒有SSCCE就很難說什麼,但我只是想知道是否有人遇到這個問題。 – 2011-01-05 18:35:48

回答

2

問題在於不透明。在我們的默認外觀「Panel.background」屬性設置爲new Color(135, 15, 19, 0)。所以所有面板默認都是不透明的。標籤名爲repaint()方法,並且所有父面板都是不透明的,但未執行背景刷新。

感謝大家爲你回覆。

2

嘗試設置文本後在適當的組件上嘗試一個repaint()

+0

謝謝,但我已經嘗試過,並沒有成功。 – 2011-01-05 18:41:11

+0

您是否嘗試過在容器/底層組件上代替標籤? – dagnelies 2011-01-05 18:44:23

+0

是的,我嘗試了他們兩個 – 2011-01-05 18:50:40

3

上的標籤嘗試setOpaque(true),這一點應引起它來清除它的背景。

+0

感謝您的回覆。不幸的是,這不是一個解決方案,因爲如果新文本長度小於舊文本長度,它不會清除最後一個字符。 – 2011-01-05 18:39:39

+0

然後我唯一能想到的就是調用Window上的repaint()。 – josefx 2011-01-05 18:51:42

2

嘗試擴展JPanel而不是JComponent。

JComponent沒有任何代碼來繪製其背景。因此,使組件不透明不會消除舊文本。保持標籤不透明並使用不透明的JPanel作爲組件的容器。

也許你在某處使用具有alpha值的背景。如果是這樣,你可以檢查出Background With Transparency你可能遇到的一些問題。

否則只有你可以與非工作代碼比較你的工作代碼,看看有什麼不同。

+0

不,沒有處理類層次結構 – 2011-01-06 14:00:29

1

camickr的答案是正確的處理方式;然而,你的測試顯然有一點是你的揮杆線程的使用。

我懷疑它也可能是與它是一個對話框。對話框通常在調用showDialog()時阻止SWMET;因此,通常會在showDialog()中創建第二個事件線程。在這裏,你不是從你從main調用它的SWMET調用showDialog() - 也許你看到了一些奇怪的效果。

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

謝謝,但我知道我自己 – 2011-01-06 13:59:59

-2

您需要輸入super.paintComponent(g);