لماذا تأثير انزلاق على بلدي جبانيل تأخر في بعض الأحيان?

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

  •  11-12-2019
  •  | 
  •  

سؤال

أنا تغيير حدود JPanel باستخدام Timer للحصول على تأثير انزلاق عندما يحوم شخص ما فوق منطقة مستطيلة معينة ، يعمل هذا كما هو متوقع.هناك أزرار في JPanel ولديهم مختلفة MouseEvent السلوكيات.لكن أحيانا ويبدأ متخلفة أو الشرائح ببطء شديد.رجاء, يمكن لأي شخص أن يقترح ماذا يمكنني أن أفعل, للتأكد من أنه يعمل بشكل جيد في كل مرة?

تحرير:

ال buttonsPanel لديك button في ذلك. buttonsPanel يضاف إلى JLayeredPane التي لها حدود كما rect.عندما جلايريدبان أو جبوتون button هو hovered يتم تشغيل أحداث الماوس.أحداث الماوس ثم يقوم بتشغيل جهاز ضبط الوقت ل slide the buttonsPanel وجلب إليها عرض.

class MyActionListener implements ActionListener {

    private static final int frames = 50;
    int count = 0;
    private final Timer timer = new Timer(1, this);

    public void start() {
        timer.start();
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if (count >= frames) {
            timer.stop();
        } else {
            count = count + 1;
            buttonsPanel.setBounds(hidden_width - hidden_width * count / frames, 0, hidden_width, frameHeight);
        }
    }
}

class MyMouseListener extends MouseAdapter {

    private MyActionListener timerListener;

    @Override
    public void mouseEntered(final MouseEvent event) {

        final Color color = new Color(50, 50, 50);
        if (event.getSource() instanceof JButton) {
            final JButton button = (JButton) event.getSource();
            button.setBackground(color);
            buttonsPanel.setVisible(true);
        } else if (!buttonsPanel.isVisible()) {
            buttonsPanel.setVisible(true);
            timerListener = new MyActionListener();
            timerListener.start();
        }
    }

    @Override
    public void mouseExited(final MouseEvent event) {
        Point point = new Point(0, 0);
        if (event.getSource() instanceof JButton) {
            final JButton button = (JButton) event.getSource();
            point = button.getLocation();
            button.setBackground(Windows8GUI.color);
        }
        Rectangle rect = new Rectangle(0, 0, hidden_width, frameHeight);
        if (!rect.contains(point.x + event.getX(), point.y + event.getY())) {
            buttonsPanel.setVisible(false);
            buttonsPanel.setBounds(0, 0, hidden_width, frameHeight);
        }
    }
}
هل كانت مفيدة؟

المحلول

المشكلة الأساسية هي أنك تفترض أن لديك سيطرة على محرك الطلاء.أنت لا ، في الواقع ، محرك الطلاء تحت رحمة نظام التشغيل.هذا يعني أنه يمكنك القفز صعودا وهبوطا كل ما تريد ، ولكن حتى نظام التشغيل ومحرك الطلاء جافا جاهزة ، لن يحدث شيء.

في الواقع ، إذا اتصلت بإعادة الطلاء بشكل متكرر في تتابع سريع ، يمكنك أن تجد نفسك تغمر محرك الطلاء بالطلبات ، مما يؤدي إلى إبطائه أكثر.

في حين ليس حلا للمشكلة برمتها ، وسوف تجعل حياتك أبسط إلى حد كبير نلقي نظرة على الإطار الزمني أو ترايدنت.

فهي" الرسوم المتحركة " أطر مصممة لإخراج العمل تخمين وتجعل حياتك أسهل.أنا الاستخدام الشخصي TimingFramework لجميع الرسوم المتحركة بلدي وأنها تعمل بشكل جيد.

تعمل أطر التوقيت على ٪ بمرور الوقت.وهذا هو ، كنت تعطيه الوقت لدورة والأطر سيعود قيمة ٪ على أساس مدى من خلال تلك الدورة هم.يمكنك تطبيق الاستيفاء ، مما يسمح لك لإحداث مدى سرعة جزء من الرسوم المتحركة سيلعب.

Trident كما تم تصميمه لتوفير وسيلة لاستدعاء طرق أخرى نيابة عنك ، لذلك يمكن تعيين حدود جزء زر بالنسبة لك ، استنادا إلى القيم التي توفرها.

نصائح أخرى

في الواقع ، إذا اتصلت بإعادة الطلاء بشكل متكرر في تتابع سريع ، يمكنك أن تجد نفسك تغمر محرك الطلاء بالطلبات ، مما يؤدي إلى إبطائه أكثر.

أعتقد أن هذه هي المشكلة الحقيقية.حاول زيادة التأخير بين أحداث المؤقت من 1 إلى 10-50 ويجب أن تعمل بشكل أفضل.

بالنسبة للكثير من الإرشادات لبناء تلك التأثيرات (والكثير من التأثيرات الأخرى) ، يمكنني فقط أن أوصي بالكتاب القذرة الغنية العملاء.في هذه الصفحة ، تجد أيضا الكثير من الأمثلة لتلك التأثيرات التي تم التعامل معها في الكتاب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top