2011-01-05 14 views
5

Ho una finestra di dialogo di avanzamento, che contiene 3 JComponents: JLabel, JProgressBar, JButton, che viene utilizzato come finestra di dialogo predefinita in diverse parti dell'applicazione da diversi filettature. Quindi quando provo a cambiare il valore dell'etichetta, non cancella lo sfondo sotto di esso, semplicemente dipinge il nuovo testo su quello vecchio. La classe wrapper non sovrascrive alcun metodo solo delegando le chiamate di metodo ai componenti che contiene.JLabel dipinge il nuovo testo su quello vecchio, dopo che il testo impostato viene chiamato

Ecco il codice:

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

Il risultato attuale è simile a http://www.daniweb.com/forums/post1073367.html#post1073367 Ma questa soluzione non era adeguata per me.

Qualcuno ha riscontrato problemi come questo?

Grazie.

Questa è la versione tagliata della classe. Ma come ho detto non ho potuto farlo funzionare in modo errato. Spero che questo ti aiuti.

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

È possibile pubblicare un SSCCE? – jzd

+0

Siamo spiacenti. Ho provato a riprodurlo in forma chiara, ma non potevo. Capisco, è molto difficile dire qualcosa senza SSCCE, ma mi stavo chiedendo se qualcuno dovesse affrontare questo problema. –

risposta

2

Il problema era con l'opacità. Nel nostro aspetto predefinito, la proprietà "Panel.background" è stata impostata su new Color(135, 15, 19, 0). Quindi tutti i pannelli erano di default non opachi. L'etichetta denominata metodo repaint() e come tutti i pannelli padre non erano opachi, l'aggiornamento in background non veniva eseguito.

Grazie a tutti per le vostre risposte.

2

provare forse un repaint() sul componente adeguata dopo aver impostato il testo.

+0

Grazie, ma ho già provato questo, e non ha avuto successo. –

+0

hai provato sul contenitore/componente sottostante invece dell'etichetta? – dagnelies

+0

Sì, ho provato entrambi –

3

Provare setOpaque(true) sull'etichetta, questo dovrebbe far sì che cancelli lo sfondo.

+0

Grazie per la risposta. Sfortunatamente questa non è una soluzione, perché se la lunghezza del nuovo testo è inferiore a quella precedente, non cancella gli ultimi caratteri. –

+0

Quindi l'unica cosa che posso pensare sarebbe chiamare repaint() sulla finestra. – josefx

2

Provare ad estendere JPanel invece di JComponent.

JComponent non ha alcun codice per dipingere lo sfondo. Quindi rendere il componente opaco non fa nulla per cancellare il vecchio testo. Mantenere l'etichetta non opaca e utilizzare un JPanel opaco come contenitore del componente.

Forse si stanno utilizzando sfondi con un valore alfa da qualche parte. Se è così, puoi dare un'occhiata a Background With Transparency per alcuni problemi che potresti incontrare.

Altrimenti solo è possibile confrontare il codice di lavoro con il codice non funzionante per vedere cosa è diverso.

+0

No, questo non ha avuto alcun rapporto con la gerarchia delle classi –

1

La risposta di camickr è il modo giusto di procedere; tuttavia, una cosa chiaramente errata nel test è l'utilizzo del thread swing.

Ho il sospetto che possa anche avere qualcosa a che fare con il fatto di essere una finestra di dialogo. Le finestre di dialogo in genere bloccano SWMET nella chiamata a showDialog(); quindi, un secondo thread di eventi viene solitamente creato in showDialog(). Qui non stai chiamando showDialog() da un SWMET che stai chiamando da main - forse stai vedendo alcuni strani effetti di questo.

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

Grazie, ma ho capito che anch'io –

-2

È necessario inserire super.paintComponent(g);

Problemi correlati