Masz przykład
Kopiuj
/* Program rysujący losową łamaną, wykorzystany jest javax.swing.Timer, co 0,1 sekundy dodawany jest kolejny segment łamanej
*/
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
public class Odcinki extends JFrame implements ActionListener
{
protected ArrayList<Line2D.Float> segmenty=new ArrayList<Line2D.Float>();
private JButton lamana;
private JButton odcinki;
private JButton stop;
private JButton save;
private JButton wymaz;
private JButton wykres;
private boolean czyLamana=true;
private Point2D.Float begin;
private javax.swing.Timer timer;
protected int[] wyniki=new int[1001];
private JFileChooser fc=new JFileChooser(".");
private RamkaWykresuOdcinkow oknoWykresu;
//------------------------
public static void main(String[] args)
{
new Odcinki();
}
//------------------------
public Odcinki()
{
JToolBar tb=new JToolBar();
odcinki=new JButton(new ImageIcon("resources/Play.gif"));
odcinki.setToolTipText("Odcinki");
odcinki.addActionListener(this);
tb.add(odcinki);
tb.addSeparator();
lamana=new JButton(new ImageIcon("resources/Play.gif"));
lamana.setToolTipText("Łamana");
lamana.addActionListener(this);
tb.add(lamana);
tb.addSeparator();
save=new JButton(new ImageIcon("resources/Save.gif"));
save.setToolTipText("Zapisanie wyników");
save.addActionListener(this);
save.setEnabled(false);
tb.add(save);
tb.addSeparator();
stop=new JButton(new ImageIcon("resources/Stop.gif"));
stop.setToolTipText("Zatrzymanie");
stop.addActionListener(this);
stop.setEnabled(false);
tb.add(stop);
tb.addSeparator();
wykres=new JButton(new ImageIcon("resources/Fast.gif"));
wykres.setToolTipText("Sporządzenie wykresu");
wykres.addActionListener(this);
wykres.setEnabled(false);
tb.add(wykres);
tb.addSeparator();
wymaz=new JButton(new ImageIcon("resources/Refresh.gif"));
wymaz.setToolTipText("Wymazanie");
wymaz.addActionListener(this);
wymaz.setEnabled(false);
tb.add(wymaz);
add(tb,BorderLayout.NORTH);
add(new PanelOdcinkow(this),BorderLayout.CENTER);
final Random r=new Random();
timer=new javax.swing.Timer(100, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(segmenty.size()==0 || !czyLamana)
{
begin=new Point2D.Float(400*r.nextFloat(),300*r.nextFloat());
}
Point2D.Float end=new Point2D.Float(400*r.nextFloat(),300*r.nextFloat());;
Line2D.Float l=new Line2D.Float(begin,end);
for(int i=(int)Math.ceil(begin.getX()*2.5);i<=(int)Math.floor(end.getX()*2.5);i++)
wyniki[i]++;
segmenty.add(l);
begin=end;
repaint();
}
});
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
oknoWykresu=new RamkaWykresuOdcinkow(this);
}
//------------------------
public void actionPerformed(ActionEvent ae)
{
JButton b=(JButton)(ae.getSource());
if(b==lamana)
{
lamana.setEnabled(false);
odcinki.setEnabled(false);
stop.setEnabled(true);
save.setEnabled(false);
wymaz.setEnabled(false);
wykres.setEnabled(false);
timer.start();
}
if(b==odcinki)
{
czyLamana=false;
lamana.setEnabled(false);
odcinki.setEnabled(false);
stop.setEnabled(true);
save.setEnabled(false);
wymaz.setEnabled(false);
wykres.setEnabled(false);
timer.start();
}
if(b==stop)
{
lamana.setEnabled(true);
odcinki.setEnabled(true);
stop.setEnabled(false);
save.setEnabled(true);
wymaz.setEnabled(true);
wykres.setEnabled(true);
timer.stop();
}
if(b==save)
{
if(fc.showSaveDialog(this)==JFileChooser.APPROVE_OPTION)
{
try
{
FileWriter fw=new FileWriter(fc.getSelectedFile());
fw.write("Ilość odcinków: "+segmenty.size()+"\n");
for (int i=0;i<wyniki.length;i++)
{
fw.write(String.format("%5.3f",i*0.001)+" - "+wyniki[i]+"\n");
}
fw.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this,e.toString(),"",JOptionPane.INFORMATION_MESSAGE);
}
}
}
if(b==wymaz)
{
lamana.setEnabled(true);
odcinki.setEnabled(true);
stop.setEnabled(false);
save.setEnabled(false);
wymaz.setEnabled(false);
wykres.setEnabled(false);
segmenty.clear();
for(int i=0;i<wyniki.length;i++)
wyniki[i]=0;
repaint();
timer.stop();
}
if(b==wykres)
{
oknoWykresu.setVisible(true);
}
}
}
//------------------------------------------------
class PanelOdcinkow extends JPanel
{
private Odcinki parent;
//------------------------
public PanelOdcinkow(Odcinki parent)
{
super();
setPreferredSize(new Dimension(400,300));
this.parent=parent;
}
//------------------------
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
for(Line2D.Float l:parent.segmenty)
g2.draw(l);
}
}
//------------------------------------------------
class RamkaWykresuOdcinkow extends JFrame
{
private Odcinki parent;
//------------------------
public RamkaWykresuOdcinkow(Odcinki parent)
{
super("Wykres");
this.parent=parent;
setLayout(new FlowLayout());
add(new PanelWykresu(parent));
pack();
setLocationRelativeTo(null);
}
}
//-------------------------------------------------
class PanelWykresu extends JPanel
{
private Odcinki parent;
//------------------------
public PanelWykresu(Odcinki parent)
{
super();
setPreferredSize(new Dimension(1020,620));
this.parent=parent;
}
//------------------------
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawLine(5,610,1015,610);
g.drawLine(1015,610,1012,608);
g.drawLine(1015,610,1012,612);
g.drawLine(10,5,10,615);
g.drawLine(10,5,12,8);
g.drawLine(10,5,8,8);
int max=0;
for(int i=0;i<parent.wyniki.length;i++)
max=Math.max(max,parent.wyniki[i]);
if(max==0)
return;
g.drawString("Ilość odcinków: "+parent.segmenty.size()+" najwieksza wartość: "+max,20,15);
int jednostka=600/max;
for(int i=0;i<parent.wyniki.length;i++)
{
int y=610-jednostka*parent.wyniki[i];
g.drawLine(10+i,y,10+i,y);
}
}
}