Pregunta

I tienen una ventana de diálogo de progreso, que contiene 3 JComponents: JLabel, JProgressBar, JButton, que se utiliza como ventana de diálogo por defecto en diferentes partes de la aplicación de diferentes hilos. Así que cuando trato de cambiar el valor de la etiqueta, no se borra el fondo debajo de ella, sólo se pinta nuevo texto sobre el antiguo. La clase contenedora no anula cualquier método que acaba de delegar método de las llamadas a los componentes que contiene.

Aquí está el 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 a un problema como este?

Gracias.

Esta es la versión cuted de la clase. Pero como ya he dicho que no podía hacer que funcione 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;
    }

}
¿Fue útil?

Solución 4

El problema era con la opacidad. En nuestro aspecto por omisión "Panel.background" propiedad se estableció en new Color(135, 15, 19, 0). Así que todos los paneles eran de forma predeterminada no opaca. El sello llamado método repaint() y, como todos los paneles padres eran no opaco, no se llevó a cabo la actualización en segundo plano.

Gracias a todos por que responde.

Otros consejos

Trate setOpaque(true) en la etiqueta, esto debería hacer que se aclare su fondo.

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

Trate extiende JPanel en lugar de JComponent.

JComponent no tiene ningún código para pintar el fondo. Por lo tanto haciendo que el componente opaco no hace nada para acabar con el antiguo texto. Mantenga la etiqueta no opaco y utilizar un JPanel opacas como el contenedor de su componente.

Puede que esté utilizando fondos en algún lugar con un valor alfa. Si es así se puede extraer Antecedentes Con Transparencia para algunos problemas que se puede encontrar.

De lo contrario sólo se puede comparar su código de trabajo con el código de no trabajo para ver lo que es diferente.

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

sospecho que también puede tener algo que ver con que sea un cuadro de diálogo. Diálogos típicamente bloquean la SWMET en la llamada a showDialog (); Por lo tanto, un segundo hilo de eventos se crea normalmente en showDialog (). Aquí no se está llamando showDialog () desde un SWMET la que está llamando desde principal -. Tal vez usted está viendo algunos efectos extraños de que

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);
 }
 });
}

Es necesario poner super.paintComponent(g);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top