JLabel рисует новый текст над старым, после того, как набор текст называется

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

  •  25-09-2019
  •  | 
  •  

Вопрос

У меня есть диалоговое окно прогресса, которое содержит 3 jComponents: JLabel, JProgressbar, JButton, который используется в качестве диалогового окна по умолчанию в разных частях приложения из разных потоков. Поэтому, когда я пытаюсь изменить значение метки, он не очищает фона под ним, он просто рисует новый текст над старым. Класс Wrapper не переопределяет любые методы, которые он просто это просто вызовы методов делегата к компонентам.

Вот код:

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

Фактический результат похож на http://www.daniweb.com/forums/post1073367.html#post1073367.Но это решение не подходит для меня.

Кто-нибудь столкнулся с такой проблемой?

Спасибо.

Это разрезанная версия класса. Но, как я уже сказал, я не мог сделать это неправильно. Надеюсь это поможет.

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

}
Это было полезно?

Решение 4

Проблема была с непрозрачностью. В нашем взгляде по умолчанию имущество «Панель. Background» было установлено на new Color(135, 15, 19, 0). Отказ Так что все панели по умолчанию не непрозрачны. Этикетка называется repaint() Метод и как все родительские панели не непрозрачные фоновые обновления не было выполнено.

Спасибо всем за вас ответы.

Другие советы

Пытаться setOpaque(true) На этикетке это должно заставить его очистить свой фон.

Попробуйте возможно A. repaint() на адекватном компоненте после установки текста.

Попробуйте расширить JPanel вместо JComponent.

JComponent не имеет никакого кода, чтобы покрасить свой фон. Таким образом, создание компонента непрозрачно не делает ничего, чтобы вытереть старый текст. Держите лейбку непрозрачной и используйте непрозрачную jpanel в качестве контейнера вашего компонента.

Может быть, вы используете фоны с альфа-значением где-то. Если это так, вы можете проверить Фон с прозрачностью Для некоторых проблем вы можете столкнуться.

В противном случае вы можете сравнить свой рабочий код с неработовым кодом, чтобы увидеть, что отличается.

Ответ из Camickr является правильным способом продолжить; Однако одна вещь, явно не так с вашим тестом - это использование вашего качания.

Я подозреваю, что это может также иметь что связаться с этим диалоговым окном. Диалоги обычно блокируют Swbet в вызове ShowDialog (); Таким образом, в ShowDialog () обычно создается вторая нить события (). Здесь вы не звоните ShowDialog () от Swbet, вы называете его от Main - возможно, вы видите некоторые странные последствия этого.

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

Вам нужно поставить super.paintComponent(g);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top