2011-01-05 9 views
5

Tengo una ventana de diálogo de progreso, que contiene 3 JComponents: JLabel, JProgressBar, JButton, que se usa como ventana de diálogo predeterminada en diferentes partes de la aplicación desde diferentes trapos. Entonces, cuando trato de cambiar el valor de la etiqueta, no borra el fondo debajo de ella, solo pinta el texto nuevo sobre el anterior. La clase contenedora no anula ningún método, solo delega llamadas de método a los componentes que contiene.JLabel pinta texto nuevo sobre el anterior, después de que el texto se llame

Aquí es código:

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

El resultado real es similar a http://www.daniweb.com/forums/post1073367.html#post1073367 Pero esa solución no era apropiado para mí.

¿Alguien ha enfrentado un problema como este?

Gracias.

Esta es la versión ejecutada de la clase. Pero como dije, no pude hacer que funcionara incorrectamente. Espero que esto ayude.

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

Se puede publicar un SSCCE? – jzd

+0

Lo siento. Traté de reproducirlo en la forma clara, pero no pude. Entiendo que es muy difícil decir algo sin SSCCE, pero me preguntaba si alguien se enfrentaba a este problema. –

Respuesta

2

El problema fue con la opacidad. En nuestra apariencia predeterminada, la propiedad "Panel.background" se estableció en new Color(135, 15, 19, 0). Entonces todos los paneles eran por defecto no opacos. La etiqueta denominada método repaint() y como todos los paneles principales no eran opacos, no se realizó la actualización de fondo.

Gracias a todos por sus respuestas.

2

tratar tal vez un repaint() en el componente adecuado después de ajustar el texto.

+0

Gracias, pero ya lo he intentado y no fue exitoso. –

+0

¿Lo ha probado en el contenedor/componente subyacente en lugar de la etiqueta? – dagnelies

+0

Sí, probé las dos –

3

Pruebe setOpaque(true) en la etiqueta, esto debería hacer que borre su fondo.

+0

Gracias por su respuesta. Lamentablemente, esta no es una solución, porque si la longitud del nuevo texto es inferior a la anterior, no borrará los últimos caracteres. –

+0

Entonces lo único que puedo pensar sería llamar a repintado() en la ventana. – josefx

2

Pruebe extender JPanel en lugar de JComponent.

JComponent no tiene ningún código para pintar su fondo. Por lo tanto, hacer el componente opaco no hace nada para borrar el texto anterior. Mantenga la etiqueta no opaca y use un JPanel opaco como contenedor de su componente.

Quizás esté utilizando fondos con un valor alfa en alguna parte. Si es así, puede consultar Background With Transparency para conocer algunos problemas que puede encontrar.

De lo contrario, solo usted puede comparar su código de trabajo con el código que no funciona para ver qué es diferente.

+0

No, eso no tenía nada que ver con la jerarquía de clases –

1

La respuesta de camickr es la forma correcta de proceder; Sin embargo, una cosa claramente incorrecta con su prueba es el uso de su hilo de swing.

Sospecho que también puede tener algo que ver con que sea un diálogo. Los cuadros de diálogo normalmente bloquean SWMET en la llamada a showDialog(); por lo tanto, un segundo hilo de evento generalmente se crea en showDialog(). Aquí no está llamando a showDialog() desde un SWMET que está llamando desde main, quizás esté viendo algunos efectos extraños de eso.

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

Gracias, pero me di cuenta de que yo mismo –

-2

Es necesario poner super.paintComponent(g);

Cuestiones relacionadas