JLabel dipinge il nuovo testo su quello vecchio, dopo che il testo set si chiama

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

  •  25-09-2019
  •  | 
  •  

Domanda

Ho una finestra di dialogo di avanzamento, che contiene 3 JComponents: JLabel, JProgressBar, JButton, che viene utilizzato come finestra predefinita finestra in diverse parti dell'applicazione da diversi thread. Così, quando si tenta di modificare il valore del marchio, non chiaro il fondo sotto di essa, semplicemente dipinge il nuovo testo su quello vecchio. La classe wrapper non sovrascrive alcun metodo semplicemente delegare le chiamate di metodo ai componenti in esso contenuti.

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 appropriato per me.

Qualcuno ha affrontato problema come questo?

Grazie.

Questa è la versione cuted della classe. Ma come ho detto non ho potuto farlo funzionare in modo non corretto. Spero che questo 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;
    }

}
È stato utile?

Soluzione 4

Il problema era con opacità. Nel nostro aspetto predefinito and feel "Panel.background" la proprietà è stata impostata su new Color(135, 15, 19, 0). Quindi, tutti i pannelli sono stati di default non opaco. Il metodo repaint() etichetta chiamata e, come tutti i pannelli genitori erano non-opachi l'aggiornamento in background non è stata eseguita.

Grazie a tutti per voi risponde.

Altri suggerimenti

setOpaque(true) sull'etichetta, questo dovrebbe indurlo a cancellare il suo sfondo.

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

Prova estende JPanel invece di JComponent.

JComponent non ha alcun codice per dipingere lo sfondo. Così facendo l'opaco componente non fa nulla per spazzare via il vecchio testo. Mantenere l'etichetta non-opaco e utilizzare un JPanel opachi come il contenitore del componente.

Forse si sta utilizzando sfondi con un qualche valore alfa. Se è così è possibile controllare Bassa Con Trasparenza per alcuni problemi si potrebbero incontrare.

In caso contrario, solo è possibile confrontare il codice lavorare con il codice non-lavoro per vedere ciò che è diverso.

La risposta dal camickr è il modo giusto di procedere; Tuttavia una cosa chiaramente sbagliato con il test è che l'uso del filo swing.

ho il sospetto che essa può anche avere qualcosa a che fare con essendo una finestra. Dialoghi tipicamente bloccano lo SWMET nella chiamata a showDialog (); quindi, un secondo filo evento viene generalmente creata in showDialog (). Qui non si sta chiamando showDialog () da una della SWMET si sta chiamando dal principale -. Forse si sta vedendo alcuni strani effetti di quel

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

È necessario mettere super.paintComponent(g);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top