Witam wszystkich. Proszę o pomoc w obsłudze mojego aplecika. Problem dotyczy prawidłowego funkcjonowania buttonów. W moim programie, którego kod zamieszczam poniżej

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JApplet;
import javax.swing.JButton;

public class Szlaki extends JApplet implements ActionListener, MouseMotionListener, MouseListener {

JButton guzik1 = new JButton("WYLICZ");
JButton guzik2 = new JButton("COFNIJ");
JButton guzik3 = new JButton("WYZERUJ");
Container guziki = getContentPane();

Graphics bufor;
Image obrazbufor;
Image obraz, obraz1;
Dimension d;

int xx,yy,licznik_wezla; // wspolzedne kursora, liczba zaznaczonych wezlow
int przewyzszenie1,przewyzszenie2,p1,p2,p,c1,c2,k1,k2;
int czas;
int xekranu,yekranu;
int suma_km;

boolean wcisniety;


String s1,s2,s3;
int spr,a,b;


Wezel  w [] = new Wezel [54];
Szlak s [] = new Szlak [87];
int wspx1[] = {0,1310,1295,14};
int wspy1[] = {0,0,14,14};
int wspx2[] = {0,1310,1295,14};
int wspy2[] = {600,600,585,585};
int wspx3[] = {0,0,14,14};
int wspy3[] = {0,600,585,14};
int wspx4[] = {1310,1310,1295,1295};
int wspy4[] = {0,600,585,14};

int tablica_wezly [] = new int [200];

@Override
public void init() {
    
    setSize(1310,600);
    xekranu=getWidth();
    yekranu=getHeight();
    suma_km = 0;
    wcisniety=false;
    d=this.size();
    
    for (int i=0;i<200;i++){ tablica_wezly[i]=-1; }
    
// INICJACJA WEZLOW SZLAKOW -----------------------------------------------
    
    spr = 0;
    a = 0;
    
    
    licznik_wezla=0;
    przewyzszenie1 = 0;
    przewyzszenie2 = 0;
    czas=0;
          
 
    for(int x = 0; x<54; x++){
       w[x] = new Wezel();
     }

           
  /*

      ...
         KOD NIE WPLYWAJACY NA MOJE PROBLEMY :)     ---------------------------------------------------------
      ...

   */     
      
   
   // USTAWIANIE ROZMIARU APLETU INICJACJA MAPY I INNYCH OBRAZKOW----------------------------------------   
      
      
             
   obraz = getImage(getDocumentBase(),"obraz.jpg");
   obrazbufor = createImage ( 1310, 600); 
   bufor = obrazbufor.getGraphics ( );
  
   
   
   // ZEROWANIE METOD USTAWIANIA KOMPONENTOW ------------------------------------------------------------
   
   setLayout(null);
         
   
   // TWORZENIE PRZYCISKOW I TAKIE TAM Z NIMI ZWIAZANE -----------------------------------------------------
   
  
   this.addMouseListener(this); 
   this.addMouseMotionListener(this); 
   guzik1.addActionListener(this);
   guzik2.addActionListener(this);
   guzik3.addActionListener(this);
   
   guziki.setLayout(null);
   guzik1.setBounds(900, 270, 100, 45);
   guzik2.setBounds(1000, 270, 100, 45);
   guzik3.setBounds(1100, 270, 100, 45);
   
   guziki.add(guzik1);
   guziki.add(guzik2); 
   guziki.add(guzik3); 
          
   s1="";
   s2="";
   s3="";
  
}

   
//  RYSOWANIE MAPY -----------------------------------------------------------------------------------------

    @Override
    public void paint(Graphics g){
      super.paint(g);
      
      int ktorywezel1,ktorywezel2;
      int xr,yr;
      String tekst1,tekst2;
    
      bufor.drawImage ( obraz, 0, 0, this );  
      
      //      RYSOWANIE  RAMKI ---------------------------------------------------
      bufor.setColor(new Color(221,123,200));
      bufor.fillPolygon(wspx1, wspy1 , 4);
      bufor.fillPolygon(wspx2, wspy2 , 4);
      bufor.setColor(new Color(200,122,200));
      bufor.fillPolygon(wspx3, wspy3 , 4);
      bufor.fillPolygon(wspx4, wspy4 , 4);
      
              
     // RYSOWANIE ZAZNACZONYCH SZLAKOW ----------------------------------
      bufor.setColor(Color.PINK);
      for (int i1=0;tablica_wezly[i1]!=-1;i1++){
         
         if (i1>0) {
            ktorywezel1 = tablica_wezly[i1-1];
            ktorywezel2 = tablica_wezly[i1];
            xr=Math.abs(w[ktorywezel1].wspx-w[ktorywezel2].wspx);
            yr=Math.abs(w[ktorywezel1].wspy-w[ktorywezel2].wspy);
            
            for (int i=0;i<5;i++){ 
                if (xr<=yr) bufor.drawLine(w[ktorywezel1].wspx+i,w[ktorywezel1].wspy, w[ktorywezel2].wspx+i, w       [ktorywezel2].wspy); 
                if (xr>yr) bufor.drawLine(w[ktorywezel1].wspx,w[ktorywezel1].wspy+i, w[ktorywezel2].wspx, w[ktorywezel2].wspy+i); 
            }
         }
      }
    
   //  LEGENDA --------------------------------------------------  
      bufor.setColor(Color.CYAN);
      bufor.fillRect(14, 510, 515, 78);
      bufor.setColor(Color.BLACK);
      Font ft = new Font ( "Tahoma", Font.BOLD, 12 );
      bufor.setFont (ft);
      bufor.drawString("Wyznacz myszką trasę zaznaczając kolejne węzły szlaków", 20, 525);
      bufor.drawString("Przycisk 'WYLICZ' - policzy przewyższenia, czas i odległość wyznaczonych szlaków", 20, 545);
      bufor.drawString("Przycisk 'COFNIJ' - cofa się o jeden zaznaczony węzeł", 20, 560);
      bufor.drawString("Przycisk 'WYZERUJ' - zeruje wszystkie zaznaczone węzły szlaków", 20, 575);
      
    
    // POCZATEK , KONIEC I WYLICZENIE -----------------------------------  
      bufor.setColor(Color.WHITE);
      Font ft1 = new Font ( "Tahoma", Font.PLAIN, 20 );
      bufor.setFont (ft1);
      if (tablica_wezly [0]!=-1) {
        tekst1="START - " + w[tablica_wezly[0]].nazwa;
        bufor.drawString(tekst1, 200, 200);
      }
      if (tablica_wezly [1]!=-1) { 
        tekst2="STOP - "+s1; 
        bufor.drawString(tekst2, 200, 230);
      } 
      
      if (wcisniety==true){
          tekst1="POD GÓRKE - "+p1;
          bufor.drawString(tekst1, 650, 150);
          tekst1="Z GÓRKI - "+p2;
          bufor.drawString(tekst1, 650, 175);
          p=Math.abs(p1-p2);
          tekst1="RÓŻNICA PRZEWYŻSZEŃ - "+p;
          bufor.drawString(tekst1, 650, 200);
          tekst1="CZAS PRZEJŚCIA -   "+c1+"-GODZ "+c2+"-MINUT";
          bufor.drawString(tekst1, 650, 225);
          tekst1="DŁUGOŚĆ PRZEJŚCIA -   "+k1+","+k2+"-KM";
          bufor.drawString(tekst1, 650, 250);
       
          wcisniety=false;
      }
                // -------------------------POCZATEK PROBLEMOW ------------------------------------ :)


      bufor.setColor(Color.lightGray);
      bufor.fillRect(900, 270, 300, 45);
      
      
      g.drawImage ( obrazbufor, 0, 0, this );
      


      guzik1.setVisible(false);
      if (licznik_wezla>1) {guzik1.setVisible(true);} 
      guzik2.setVisible(false);
      if (licznik_wezla>1) {guzik2.setVisible(true);} 
      guzik3.setVisible(false);
      if (licznik_wezla>0) {guzik3.setVisible(true);} 
  
         
  
}
  @Override
public void update(Graphics g) { 
     
   paint ( g ); 
  
}
 

// NASLUCH WCISNIECIA GUZIKA ----------------------------------------------------------------------------------------------

@Override
public void actionPerformed(ActionEvent przycisk){
    Object zrodlo = przycisk.getSource();
    int stop1,stop2,stan1,stan2;
    int roznica1,roznica2;
    
    if (zrodlo == guzik1) {
       if (licznik_wezla>1){
           
           // --------------------------------------------wyliczenie przewyzszenia
           for (int i=0;i<licznik_wezla-1;i++){
              stop1 = tablica_wezly[i];
              stan1 = w[stop1].wysokosc;
              stop2 = tablica_wezly[i+1];
              stan2 = w[stop2].wysokosc;
              
            
              if (stan1<stan2){
                  roznica1 = stan2-stan1;
                  przewyzszenie1 = przewyzszenie1 + roznica1;
                  
              }
              
              if (stan1>stan2){
                  roznica2 = stan2-stan1;
                  przewyzszenie2 = przewyzszenie2 - roznica2;
              
              }         
              
              for(int i1=0; i1<87; i1++){
                  
                  if ((s[i1].nrwezla1==stop1) && (s[i1].nrwezla2==stop2)){
                      czas=czas+s[i1].czas1;
                      suma_km=suma_km+s[i1].kilometry;
                  }
                  if ((s[i1].nrwezla2==stop1) && (s[i1].nrwezla1==stop2)){
                      czas=czas+s[i1].czas2;
                      suma_km=suma_km+s[i1].kilometry;
                  }
                  
              }
              
              
           }
           
         wcisniety=true;
       }
       
    
    }
    
    if (zrodlo == guzik2)  {
       if (licznik_wezla>0){
           licznik_wezla--;
           tablica_wezly[licznik_wezla]=-1;
           s1=w[tablica_wezly[licznik_wezla-1]].nazwa;
           
       }
        
    }
    
    if (zrodlo == guzik3){
       licznik_wezla=0;
       przewyzszenie1=0;
       przewyzszenie2=0;
       czas=0;
       for (int i=0;i<200;i++){ tablica_wezly[i]=-1; }
       s1="";
       wcisniety=false;
       
    }

p1=przewyzszenie1;
p2=przewyzszenie2;
c1=czas/60;
c2=czas%60;
k1=suma_km/10;
k2=suma_km%10;

   
przewyzszenie1=0;
przewyzszenie2=0;
czas=0;
suma_km=0;

repaint();


}

// --------------------WCISNIECIE I PRZECIAGNIECIE KURSORA-----------------------------------------------------------------
@Override
public void mouseDragged(MouseEvent e) {

}


// ---------------RUCH KURSORA PO APLECIE--------------------------------------------------------------
@Override
public void mouseMoved(MouseEvent e) {
    this.xx = e.getX();
    this.yy = e.getY();
  
}


// ---------------KLIKNIECIE MYSZKA----------------------------------------------------------------
@Override
public void mouseClicked(MouseEvent e) {
    
    
    for (int i=1;i<54;i++){
        
                
       if (((xx+7>w[i].wspx) && (xx - 7<w[i].wspx)) && ((yy+7>w[i].wspy) && (yy - 7<w[i].wspy))){
           
          if (licznik_wezla ==0){
              tablica_wezly [licznik_wezla]=w[i].nrwezla;
              licznik_wezla = 1;
              s1=w[i].nazwa;
          }  
          else{
          
              if (i != tablica_wezly[licznik_wezla-1]){
                  for (int i1=0;i1<7;i1++){
                      if (i == w[tablica_wezly[licznik_wezla-1]].sasiednie[i1] ){
                          tablica_wezly[licznik_wezla]= i;
                          s1=w[i].nazwa;
                          licznik_wezla++;
                      }
                  }
              }
          }
          repaint();
       }
    }   
}

// ---------------------WCISNIECIE I TRZYMANIE MYSZY---------------------------------------------------
@Override
public void mousePressed(MouseEvent e) {
   
}

// ------------ZWOLNIENIE MYSZY -----------------------------------------------------------------------
@Override
public void mouseReleased(MouseEvent e) {
    
}


//-------- OBSLUGA GDY POJAWIA SIE NA APLECIE --------------------------------------------------------------
@Override
public void mouseEntered(MouseEvent e) {
 
}

// -------OBSLUGA GDY WYJDZIE Z APLETU -------------------------------------------------------------- 
@Override
public void mouseExited(MouseEvent e) {
   
}
   

}

W metodzie paint musialem zastosować dziwne rozwiązania co do warunkowego wyświetlanie buttonów.

    " guzik1.setVisible(false);
      if (licznik_wezla>1) {guzik1.setVisible(true);} 
      guzik2.setVisible(false);
      if (licznik_wezla>1) {guzik2.setVisible(true);} 
      guzik3.setVisible(false);
      if (licznik_wezla>0) {guzik3.setVisible(true);}   "

Jak mniemam nie jest to najlepsze rozwiązanie, ale bez wywolania setVisible(false) za kazdym razem przy repaincie przyciski nie pokazują się, chyba że najade na nie kursorem myszki. poza tym jeżeli wcisne przycisk "WYZERUJ" wszystkie przyciski powinny zniknąć i tak się dzieje ale w ich miejsce powinien namalować ramke a tego już nie robi, dopiero po kolejnym repaincie.

Będę wdzięczny za jakąkolwiek pomoc, aplet ten jest wrzucony na serwer pod adresem http://www.java.bogusz.eu/build/Szlaki.html
Wiem że program jest biedny graficznie i takie tam ale mi bardziej chodzi o nauke niż wyglądy.

poza tym jakby ktoś wiedział dlaczego aplet ten migocze mi przy przesówaniu strony (dla rozdzielczości mniejszej niż 1300/600) pomimo podwójnego buforowania też będę wdzieczny za pomoc.