pasek postepu jako interpretacja uciekającego czasu

pasek postepu jako interpretacja uciekającego czasu
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

jestem świerzym użytkownikiem tego forum. na początku wszystkich witam
zaczynam swoją przygodę z jezykiem programowania jakim jest JAVA.
i po paru dniach :) udało mi sie napisac prosty programik odliczający takt, chciałbym dopisać do niego jeszcze coś na zasadzie paska postępu uciekającego czasu do kolejnego taktu
program podzieliłem na 3 wątki
i tak

Test.java

Kopiuj
public class Test
{
	public static void main(String[] args)
	{
		Andom adm = new Andom();
		adm.setVisible(true);
						
	}
}

Timer.java

Kopiuj
public class Timer extends Thread 
{
	
	Andom adm;

double sCzas;
	Timer(Andom andom)
	{
		adm = andom;
	}
	
	public void SetTime(double time)
	{
		sCzas = time;
	}
	
	public void run() { 
        while (true)
        { 
        	try{sleep((long) sCzas);} 
            catch (InterruptedException e){} 
        	adm.Timer();
        } 
	 				  }
	
	
	
	
}

i właściwy w którym jest cały kod
Andom.java

Kopiuj
import java.awt.*;
import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.swing.*;

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;


public class Andom extends JFrame implements KeyListener, ActionListener 
{

private static final long serialVersionUID = 1L;  	
JPanel p; 
JPanel p1=new JPanel(); 
JPanel p2=new JPanel(); 
JPanel p3=new JPanel();
JPanel p4=new JPanel();
JPanel p5=new JPanel();


JLabel l1=new JLabel("taktomierz");
JLabel l4=new JLabel("4");
JLabel l6=new JLabel("6");
JLabel l8=new JLabel("8");
JLabel l9=new JLabel("9");
JLabel l10=new JLabel("10");
JLabel lkomunikat=new JLabel("");
Timer timer;


JMenuBar mb=new JMenuBar();
JMenu mplik=new JMenu("Plik");
JMenuItem mizamknij=new JMenuItem("Zamknij");
JMenuItem miczas=new JMenuItem("zmiana czasu taktu");
JMenuItem mizero=new JMenuItem("zerowanie");
JMenuItem miabout=new JMenuItem("About");

int liczba = Integer.parseInt(l4.getText());
int liczba2 = Integer.parseInt(l10.getText());
int takt;
int wtakt;
int taktP;
int wtaktP;
int plan;
int ist;
int soll;
int prod;

@SuppressWarnings("deprecation")
public Andom() 
{
	super( "Andom" );
	//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
	setSize(1280,768);
	
	mplik.add(miczas);
	mplik.add(mizero);
	mplik.add(mizamknij);
	
	setJMenuBar(mb);
	mb.add(mplik); 
	mb.add(miabout);
	mizamknij.addActionListener(this);
	miabout.addActionListener(this);
	miczas.addActionListener(this);
	mizero.addActionListener(this);
	
l1.setVerticalTextPosition(JLabel.CENTER);
l1.setHorizontalAlignment(JLabel.CENTER);
l1.setFont(new Font("Dialog",Font.BOLD,60));

l4.setVerticalTextPosition(JLabel.CENTER);
l4.setHorizontalAlignment(JLabel.CENTER);
l4.setFont(new Font("Dialog",Font.BOLD,160));

l6.setVerticalTextPosition(JLabel.CENTER);
l6.setHorizontalAlignment(JLabel.CENTER);
l6.setFont(new Font("Dialog",Font.BOLD,120));

l8.setVerticalTextPosition(JLabel.CENTER);
l8.setHorizontalAlignment(JLabel.CENTER);
l8.setFont(new Font("Dialog",Font.BOLD,70));

lkomunikat.setVerticalTextPosition(JLabel.CENTER);
lkomunikat.setHorizontalAlignment(JLabel.CENTER);
lkomunikat.setFont(new Font("Dialog",Font.BOLD,50));

l10.setVerticalTextPosition(JLabel.CENTER);
l10.setHorizontalAlignment(JLabel.CENTER);
l10.setFont(new Font("Dialog",Font.BOLD,50));


p=(JPanel)getContentPane();

p.add(p1,BorderLayout.NORTH);
p1.setLayout(new GridLayout(1,3));
p1.setPreferredSize(new Dimension (MAXIMIZED_HORIZ,100));
p1.setBackground(Color.GREEN);
p1.add(l1);
 
p.add(p2,BorderLayout.CENTER);
p2.setLayout(new GridLayout(3,2));
p2.add(l4);
p2.add(l8);

p.add(p3,BorderLayout.SOUTH); 
p3.setLayout(new GridLayout(1,1));
p3.setPreferredSize(new Dimension (MAXIMIZED_HORIZ,100));
p3.setBackground(Color.green);
p3.add(lkomunikat);


timer = new Timer(this);
timer.start();
timer.suspend();
lkomunikat.setText(("naciśnij start"));

String sCzas = JOptionPane.showInputDialog("podaj czas w sekundach");
double czas = Double.parseDouble(sCzas);
timer.SetTime(czas*1000);

setFocusable(true);
addKeyListener(this);
setVisible(true);

}

public void keyPressed(KeyEvent e){}
  
@SuppressWarnings("deprecation")
public void keyReleased(KeyEvent e)
{
	if (e.getKeyCode()==116) // f5
	{
		timer.resume();
		lkomunikat.setText(("Praca"));
	}
	
	else if (e.getKeyCode()==118) // f7
		{
		timer.suspend();
		lkomunikat.setText(("Przerwa")); 
		}

	}

public void keyTyped(KeyEvent e)
{}

@SuppressWarnings("deprecation")
public void actionPerformed (ActionEvent e)
{
	if(e.getSource()==mizamknij)
		 System.exit(0);
	
	else if(e.getSource()==miczas)
	{ 
		String sTakt = JOptionPane.showInputDialog("podaj czas w sekundach");
		wtakt = Integer.parseInt(sTakt);
		takt = (wtakt*1000);
		timer.SetTime(takt);
	}	
	
	else if(e.getSource()==mizero)
	{ 
		l4.setText(Integer.toString(liczba=0));
		lkomunikat.setText(("naciśnij start"));
		timer.suspend();

	}
	
	
	else if(e.getSource()==miabout)
		JOptionPane.showMessageDialog(null,"Czas taktu: linii = "+ (wtakt) + " s.");
		
	}

public void Timer() {

		liczba ++;
		l4.setText(String.valueOf(liczba));
		cykl1();
			
		
					}
public void cykl1()
{
	AudioStream BGM;
	
try 
	{ 
    InputStream test = new FileInputStream("ding.wav");
    BGM = new AudioStream(test); 
    AudioPlayer.player.start(BGM); 
    System.out.println("cykl1");
	} 
catch(FileNotFoundException e)
	{ 
    System.out.print(e.toString()); 
	} 
catch(IOException error) 
	{ 
    System.out.print(error.toString()); 
	} 
}



}

Wiem, że można to jeszcze zoptymalizowac ale nie wiem jak,

proszę o pomoc jak dodać tutaj JprogresBar albo coś takiego...

Dziękuję wszystkim za pomoc

  • Rejestracja: dni
  • Ostatnio: dni
2

Po nazwie tematu spodziewałem się wątku o egzystencji, przemijaniu, a tu takie przyziemne problemy...

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Fakt, może się tak kojarzyć :)
no cóż wracamy na ziemię......

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

Zamiast własnego timera użyj tego z API. Mniej problemów. Wyekstrahuj z klasy Andom GUI do osobnych klas. Komunikację(aktualizację paska) zrób w oparciu o wzorzec obserwatora. To uprości czytanie kodu.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Witaj, brzmi bardzo ładnie, i na pewno wielu użytkowników wie jak to zrobić ....
jestem bardzo początkującym proszę o jakieś hm... prostsze, trafiające do .... sugestie

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

ale Timer robić też w osobnym wątku czy wszystko w jednym

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Wszystko w jednym, standardowy Timer pracuje w osobnym wątku. Ty nie musisz jawnie tworzyć wątków.

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

TimerTask w rzeczywistości jest to implementacja Runnable, która jest zarządzana przez Timer (http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html) który już sobie poradzi z wątkami. Timer działa w ramach "głównego" wątku programu tak jak masz pokazane w przykładzie z linku:

Kopiuj
public static void main(String args[]) {
        new Reminder(5); // <- tu odpalany jest Timer bez tworzenia nowego wątku.
        System.out.format("Task scheduled.%n");
    }
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Ok.
idę coś pisać za wszystkie sugestie dziękuje
i proszę o więcej

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.