لماذا تأثير انزلاق على بلدي جبانيل تأخر في بعض الأحيان?
سؤال
أنا تغيير حدود 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 ويجب أن تعمل بشكل أفضل.
بالنسبة للكثير من الإرشادات لبناء تلك التأثيرات (والكثير من التأثيرات الأخرى) ، يمكنني فقط أن أوصي بالكتاب القذرة الغنية العملاء.في هذه الصفحة ، تجد أيضا الكثير من الأمثلة لتلك التأثيرات التي تم التعامل معها في الكتاب.