يرسم 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

كانت المشكلة مع العتامة. في المظهر الافتراضي لدينا ، تم تعيين خاصية "panel.background" new Color(135, 15, 19, 0). لذلك كانت جميع اللوحات افتراضيا غير معتمدة. تسمى التسمية repaint() الطريقة وكما كانت جميع الألواح الوالدية غير معتمدة ، لم يتم تنفيذ تحديث الخلفية.

شكرا للجميع على الردود.

نصائح أخرى

محاولة setOpaque(true) على الملصق ، يجب أن يتسبب ذلك في إزالة خلفيته.

جرب ربما أ repaint() على المكون الكافي بعد تعيين النص.

حاول تمديد jpanel بدلاً من jComponent.

JComponent ليس لديه أي رمز لطلاء خلفيته. لذا فإن جعل المكون غير شفاف لا يفعل أي شيء لمسح النص القديم. حافظ على التسمية غير معتمدة واستخدم jpanel غير شفاف كحاوية للمكون.

ربما تستخدم خلفيات ذات قيمة ألفا في مكان ما. إذا كان الأمر كذلك يمكنك التحقق من خلفية مع الشفافية لبعض المشاكل التي قد تواجهها.

وإلا فإنك يمكنك مقارنة رمز العمل الخاص بك باستخدام رمز غير العمل لمعرفة ما هو مختلف.

الجواب من Camickr هو الطريقة الصحيحة للمتابعة ؛ ومع ذلك ، هناك شيء واحد خاطئ بوضوح في اختبارك هو استخدام سلسلة التأرجح.

أظن أنه قد يكون له علاقة به أيضًا كونه مربع حوار. عادة ما تمنع الحوارات السواقة في المكالمة إلى showdialog () ؛ وبالتالي ، يتم إنشاء مؤشر ترابط الحدث الثاني عادة في showdialog (). هنا لا تتصل بـ ShowDialog () من Swmet الذي تسميه من 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