Почему эффект скольжения на моей JPanel иногда запаздывает?

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

  •  11-12-2019
  •  | 
  •  

Вопрос

Я меняю границы JPanel используя Timer чтобы получить эффект скольжения, когда кто-то наводит курсор на определенную прямоугольную область, это работает так, как ожидалось.Есть кнопки в JPanel и у них разные MouseEvent поведение.Но ИНОГДА он начинает отставать или скользит очень медленно.Пожалуйста, может ли кто-нибудь подсказать, что я могу сделать, чтобы он каждый раз работал хорошо?

ОТРЕДАКТИРОВАНО:

А buttonsPanel иметь button в этом. buttonsPanel добавляется в JLayeredPane которые имеют границы как rect.Когда JLayeredPane или JButton 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);
        }
    }
}
Это было полезно?

Решение

Основная проблема заключается в том, что вы предполагаете, что имеете контроль над механизмом рисования.На самом деле это не так, движок рисования находится во власти ОС.Это означает, что вы можете сколько угодно прыгать вверх и вниз, но пока ОС и механизм рисования Java не будут готовы, ничего не произойдет.

Фактически, если вы вызываете repaint несколько раз подряд, вы можете обнаружить, что наводняете движок рисования запросами, что еще больше замедляет его работу.

Хотя это и не решение всей проблемы, оно значительно упростит вашу жизнь. СрокиРамки или Трезубец.

Это «анимационные» фреймворки, предназначенные для того, чтобы избавить вас от догадок и облегчить вашу жизнь.Я лично использую TimingFramework для всей моей анимации, и она работает хорошо.

Временные рамки работают на процент с течением времени.То есть вы указываете время цикла, и платформы возвращают значение в % в зависимости от того, насколько далеко они прошли в этом цикле.Вы можете применять интерполяцию, позволяя влиять на скорость воспроизведения части анимации.

Trident также был разработан для предоставления средств для вызова других методов от вашего имени, чтобы он мог устанавливать для вас границы панели кнопок на основе значений, которые вы ей предоставляете.

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

Фактически, если вы вызываете repaint несколько раз подряд, вы можете обнаружить, что наводняете движок рисования запросами, что еще больше замедляет его работу.

Я думаю, что это настоящая проблема.Попробуйте увеличить задержку между событиями таймера с 1 до 10-50, и все должно работать намного лучше.

Из множества инструкций по созданию этих (и многих других) эффектов я могу только порекомендовать Книгу. Невероятно богатые клиенты.На этой странице вы также найдете множество примеров эффектов, описанных в книге.

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