ClockProgramma

  • Onderwerp starter Onderwerp starter bram2
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

bram2

Gebruiker
Lid geworden
23 nov 2006
Berichten
80
Ben zopas java beginnen te leren. Ik ben bezig met een klein programmatje dat de tijd vergeeft.

Wat ik voorlopig al heb (elke klasse staat in andere file (ik heb 3 files dus) )
Code:
public class TimeDemo {
	public void Init(){
		Clock_interface my_clock = new Clock_interface();
	}
	public static void main(String[] args) {
		TimeDemo my_demo = new TimeDemo();
		my_demo.Init();
	}
}


import java.awt.*;
import java.util.Date;
import javax.swing.*;

public class Clock_interface extends JFrame {
	public Date Datum = new Date();
	int seconden = Datum.getSeconds();
	int minuten = Datum.getMinutes();
	int uren = Datum.getHours();
	JButton  my_button = new JButton("refresh");
	JLabel my_text1 = new JLabel(Integer.toString(uren));
	JLabel my_text2 = new JLabel(Integer.toString(minuten));
	JLabel my_text3 = new JLabel(Integer.toString(seconden));
	
	public Clock_interface() {
	    Container c = getContentPane();
	    c.setLayout(new FlowLayout());
	    c.add(my_button);
	    my_button.addActionListener(new Refresh(c));
	    c.add(my_text1);
	    c.add(my_text2);
	    c.add(my_text3);   
	    setSize(300, 200);
	    show();
	  }

}



import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

public class Refresh implements ActionListener {
		Refresh(Container c) {
	  }
	  public void actionPerformed(ActionEvent e) {
		System.out.println("Button was clicked");
		//my_clock.Datum = new Date();
	  	//my_clock.my_text1.setText(Integer.toString(my_clock.Datum.getHours()));
	  	//my_clock.my_text2.setText(Integer.toString(my_clock.Datum.getMinutes()));
	  	//my_clock.my_text3.setText(Integer.toString(my_clock.Datum.getSeconds()));
	  	//my_clock.my_text1.repaint();
	  	//my_clock.my_text2.repaint();
	  	//my_clock.my_text3.repaint();
	   }
}
Op deze manier krijg ik bij initalisatie die huidige tijd van mijn computer. Als ik in de GUI op de button klikt komt er "Button was clicked"

Nu is de bedoeling om wanneer ik op de Button klik ook de tijdaanduiding te updaten. Dit wil ik doen via de code in commentaar in klasse refresh. Met de huidige code krijg ik echter als probleem dat "my_clock cannot be resolved".

Ik heb niet echt een idee wat ik fout doe, kan iemand mij helpen? Alvast bedankt
 
De klasse Refresh heeft geen enkele kennis van iets dat 'my_clock' heet. Hij zou alleen maar de Container kunnen kennen die als argument in de constructor is gebruikt. Persoonlijk zou ik liever Clock_interface hebben gebruikt in de constructor, of een andere oplossing hebben gekozen.

Het kan wel door de Clock_interface op te zoeken die uiteindelijk de Container bevat, met getParent:

Code:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

public class Refresh implements ActionListener {
    private Clock_interface myClock;

    Refresh(Container c) {
        this.myClock = 
                (Clock_interface)c.getParent().getParent().getParent();
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println("Button was clicked");
        myClock.Datum = new Date();
        myClock.my_text1.setText(Integer.toString(myClock.Datum.getHours()));
        myClock.my_text2.setText(Integer.toString(myClock.Datum.getMinutes()));
        myClock.my_text3.setText(Integer.toString(myClock.Datum.getSeconds()));
        myClock.my_text1.repaint();
        myClock.my_text2.repaint();
        myClock.my_text3.repaint();
    }
}
 
De klasse Refresh heeft geen enkele kennis van iets dat 'my_clock' heet. Hij zou alleen maar de Container kunnen kennen die als argument in de constructor is gebruikt. Persoonlijk zou ik liever Clock_interface hebben gebruikt in de constructor, of een andere oplossing hebben gekozen.

Wat is dan een elegantere oplossing? Het doel van dit programma is niet een klok maken, maar java leren.
 
Laatst bewerkt:
Ik zou van de ActionListener een inner class maken. Dan kan hij direct gebruik maken van alle velden en methodes van de Clock_interface. Bijvoorbeeld van een methode die de labels update met een nieuwe tijd. Zo:
Code:
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Clock_interface extends JFrame {

    JButton my_button = new JButton("refresh");
    JLabel uren = new JLabel();
    JLabel minuten = new JLabel();
    JLabel seconden = new JLabel();

    public Clock_interface() {
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(my_button);
        my_button.addActionListener(new Refresh());
        c.add(uren);
        c.add(minuten);
        c.add(seconden);
        refreshTime();
        setSize(300, 200);
        this.setVisible(true);
    }

    public void refreshTime() {
        Calendar kalender = new GregorianCalendar();

        uren.setText(String.valueOf(kalender.get(Calendar.HOUR_OF_DAY)));
        minuten.setText(String.valueOf(kalender.get(Calendar.MINUTE)));
        seconden.setText(String.valueOf(kalender.get(Calendar.SECOND)));
    }

    private class Refresh implements ActionListener {
        Refresh() {
        }
        public void actionPerformed(ActionEvent e) {
            System.out.println("Button was clicked");
            refreshTime();
        }
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan