2

誰かが特定の長方形の領域にカーソルを合わせたときにスライド効果を得るためにaJPanelを使用して aの境界を変更していますが、これは期待どおりに機能しています。Timerにはボタンがあり、動作JPanelが異なりMouseEventます。しかし、時々遅れたり、スライドが非常に遅くなったりします。毎回うまく機能するように、誰かが私に何ができるかを提案できますか?

編集:

その中buttonsPanelbuttonある。として境界を持つbuttonsPanela に追加されます。JLayeredPane または JButtonの場合、マウスイベントがトリガーされます。次に、マウス イベントによってタイマーがトリガーされ、ビューが表示されます。JLayeredPanerectbuttonhoveredslide 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);
        }
    }
}
4

2 に答える 2

3

主な問題は、ペイント エンジンを制御できると想定していることです。実際、ペイント エンジンは OS に翻弄されています。これは、好きなように上下にジャンプできることを意味しますが、OS と Java のペイント エンジンの準備が整うまで、何も起こりません。

実際、repaint を立て続けに繰り返し呼び出すと、描画エンジンが要求で溢れかえり、さらに遅くなることがあります。

問題全体の解決策ではありませんが、TimingFrameworkまたはTridentを見ると、人生が大幅に簡素化されます。

これらは「アニメーション」フレームワークであり、当て推量を取り除き、作業を楽にするように設計されています。私はすべてのアニメーションに個人的に使用TimingFrameworkしていますが、うまく機能します。

タイミング フレームワークは、時間の経過とともに一定の割合で機能します。つまり、サイクルの時間を与えると、フレームワークはそのサイクルの進行状況に基づいて % 値を返します。補間を適用して、アニメーションの一部の再生速度を調整できます。

Tridentまた、ユーザーに代わって他のメソッドを呼び出す手段を提供するように設計されているため、指定した値に基づいてボタン ペインの境界を設定できます。

于 2012-07-26T09:13:13.503 に答える
3

実際、repaint を立て続けに繰り返し呼び出すと、描画エンジンが要求で溢れかえり、さらに遅くなることがあります。

これが本当の問題だと思います。タイマー イベント間の遅延を 1 から 10-50 に増やしてみると、はるかにうまく動作するはずです。

これらの (および他の多くの) エフェクトを構築するための多くのハウツーについては、Book Filthy Rich Clientsのみをお勧めします。このページには、本で扱った効果の例もたくさんあります。

于 2012-07-26T09:25:04.467 に答える