باستخدام ActionListener في فئة واحدة لبدء الموقت في فئة أخرى

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

سؤال

ولدي فئة (المحاكاة) مما يخلق مثيل من فئة أخرى (GUI). داخل GUI الطبقة هناك زر (ابدأ) والذي يحتوي على actionlistener المرتبطة به.

وانا بحاجة الى هذا actionlistener لبدء الموقت في محاكاة لكنني لا يمكن معرفة كيفية القيام بذلك.

والرمز في محاكاة الدرجة:

public class Simulation{

private static JFrame frame;
private static GUI control;
public static Integer xcontrol = 100, ycontrol = 100;

public Timer timer;
public int steps;

public static void main(String[] args) {
    Simulation sim = new Simulation ();

}

public Simulation() {

frame = new JFrame("Action Listener Test");
frame.setLayout(new BorderLayout(1,0));

control = new GUI (xcontrol, ycontrol);
frame.getContentPane().add(control , BorderLayout.CENTER);

frame.setResizable(false);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}


public void StartTimer() {
    timer.start();
    System.out.println("It worked!");   
}

ورمز في واجهة المستخدم الرسومية الدرجة:

        panel1.add(button1a);

            button1a.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent event) {
                    Simulation.StartTimer();
                    }
                } );

والخطأ الكسوف يقول لي هناك، غير أن ل "Simulation.timer.start ()؛" :

لا يمكن جعل مرجع ثابتة إلى طريقة غير ثابت StartTimer () من نوع المحاكاة.

ولكن طريقة StartTimer () لا يمكن أن تكون ثابتة كما يبدو لكسر توقيت ...

وأي مساعدة سيكون موضع تقدير جدا.

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

المحلول

وممر this كحجة لمنشئ GUI.

في عام فمن الأفضل لتجنب مثل هذه الإشارات الدورية. أصبح كل من GUI وSimulator تعتمد على بعضها البعض. جوهر الحل هو فصل واجهة المستخدم الرسومية من سلوك مجال معين مثيرة للاهتمام.

و(BTW:..! وأود أن تجنب بشدة باستخدام المتغيرات ثابتة لأي شيء آخر من الثوابت أيضا تجنب المتغيرات مثلا غير خاصة ولكن نقطة عن عدم تمديد JFrame)

وهناك بعض النمطي البشعة التي يجب أن تضاف إلى منع خاصية تعدد.

public static void main(final String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
                Simulation sim = new Simulation();
    }});
}

نصائح أخرى

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

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