Jlabel pinta um novo texto sobre o antigo, depois que o texto definido é chamado

StackOverflow https://stackoverflow.com/questions/4607511

  •  25-09-2019
  •  | 
  •  

Pergunta

Eu tenho uma janela de diálogo de progresso, que contém 3 jComponents: Jlabel, JProgressBar, JButton, que é usado como janela de diálogo padrão em diferentes partes do aplicativo de diferentes threads. Então, quando tento alterar o valor do rótulo, ele não limpa o fundo, apenas pinta um novo texto sobre o antigo. A classe Wrapper não substitui nenhum método que ele apenas delegue as chamadas para os componentes que ele contém.

Aqui está o código:

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

O resultado real é semelhante a http://www.daniweb.com/forums/post1073367.html#post1073367Mas essa solução não foi apropriada para mim.

Alguém enfrentou problemas como este?

Obrigado.

Esta é a versão cortada da classe. Mas como eu disse, não poderia fazê -lo funcionar incorretamente. Espero que isto ajude.

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

}
Foi útil?

Solução 4

O problema estava com a opacidade. Em nossa aparência padrão, a propriedade "painel.background" foi definida como new Color(135, 15, 19, 0). Portanto, todos os painéis eram por padrão não opeso. O rótulo chamado repaint() Método e, como todos os painéis parentais não foram opeso, a atualização de fundo não foi realizada.

Obrigado a todos por você responde.

Outras dicas

Tentar setOpaque(true) No rótulo, isso deve fazer com que ele limpe seu plano de fundo.

tente talvez um repaint() no componente adequado após definir o texto.

Tente estender o JPanel em vez do JComponent.

O JComponent não possui nenhum código para pintar seu plano de fundo. Portanto, fazer o componente opaco não faz nada para acabar com o texto antigo. Mantenha o rótulo não opeso e use um JPanel opaco como o recipiente do seu componente.

Talvez você esteja usando fundos com um valor alfa em algum lugar. Se sim, você pode conferir Fundo com transparência Para alguns problemas que você pode encontrar.

Caso contrário, você poderá comparar seu código de trabalho com o código que não trabalha para ver o que é diferente.

A resposta de Camickr é a maneira certa de prosseguir; No entanto, uma coisa claramente errada com o seu teste é o uso do fio de swing.

Eu suspeito que também pode ter algo a ver com ser uma caixa de diálogo. Os diálogos normalmente bloqueiam o swmet na chamada para showdialog (); Assim, um segundo thread de eventos é geralmente criado no showDialog (). Aqui você não está chamando o showdialog () de um swmet que você está chamando de Main - talvez você esteja vendo alguns efeitos estranhos disso.

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

Você precisa colocar super.paintComponent(g);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top