سؤال

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

  • لقد لاحظت ذلك من أجل تحريك JLabels عبر الشاشة أحتاج إلى ذلك setlayout(null); و setbounds من المكون ثم التحريك في نهاية المطاف setlocation(x,y);. هل هذه أفضل الممارسات أو طريقة فظيعة لتحريك مكون؟ أخطط في نهاية المطاف في صنع فصل للرسوم المتحركة ولكني لا أريد أن أفعل ذلك وينتهي به الأمر إلى الاضطرار إلى التخلص منه.

لقد قمت بتضمين التعليمات البرمجية ذات الصلة لفحص مراجعة سريع.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GraphicsPanel extends JPanel  {
    private Timer timer;
    private long startTime = 0;
    private int numFrames = 0;
    private float fps = 0.0f;
    private int x = 0;

    GraphicsPanel() {
        final Entity ent1 = new Entity();
        ent1.setBounds(x, 0, ent1.getWidth(), ent1.getHeight());
        add(ent1);

        //ESSENTIAL
        setLayout(null);

        //GAMELOOP
        timer = new Timer(30, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                getFPS();
                incX();
                ent1.setLocation(x, 0);
                repaint();
            }
        });
        timer.start();
    }

    public void incX() { x++; }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setClip(0, 0, getWidth(), getHeight());

        g2.setColor(Color.BLACK);
        g2.drawString("FPS: " + fps, 1, 15);
    }

    public void getFPS()
    {
        ++numFrames;
        if (startTime == 0) {
            startTime = System.currentTimeMillis();
        } else {
            long currentTime = System.currentTimeMillis();
            long delta = (currentTime - startTime);
            if (delta > 1000) {
                fps = (numFrames * 1000) / delta;
                numFrames = 0;
                startTime = currentTime;              
            }
        }
    }
}

شكرًا لك!

هل كانت مفيدة؟

المحلول

لقد لاحظت أنه من أجل تحريك JLabels عبر الشاشة ، أحتاج إلى setLayout (NULL) ؛ و setbounds من المكون ثم إلى تحريك في نهاية المطاف setlocation (x ، y) ؛. هل هذه أفضل الممارسات أو طريقة فظيعة لتحريك مكون؟

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

أجد أنها أسهل طريقة للقيام بالرسوم المتحركة لأن Swing ستعيد إعادة رسم الموقع "الأخير" للمكون (لاستعادة الخلفية) وكذلك رسم الموقع الجديد للمكون. يتم تحقيق كل هذا بواسطة طريقة setLocation () واحدة.

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

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