Java: Bord met knopjes

Moderators: jkien, Xilvo

Reageer
Berichten: 10

Java: Bord met knopjes

Ik ben een woordspel aan het ontwerpen.
Er wordt een bord van 4 bij 14 hokjes op het scherm getoond.

Het bord wordt eerst met knoppen(JButtons) met de het *-teken gevuld.

Daarna worden de eerste vijf knoppen gevuld met de letter P.
Wat er nu gebeurt is dat een lange deun wordt gespeeld en dan pas worden de letters geplaatst.

De bedoeling is dat er eerst een teken wordt geplaatst en daarna een deuntje wordt gespeeld.

En dan het volgende teken met het deuntje, totdat alle de vijf tekens en de daarbij behorende deuntjes zijn geplaatst.
Als ik de code "Thread.sleep(100);" in GeluidTest weghaal loopt de tekst wel goed door, maar dan hoor ik geen geluid.
Ik denk wel dat het met threads moet worden opgelost, maar geen flauw idee hoe.
Dit is niet de volledige code van het spel, maar alleen die van drie classen waar het om draait.

Ik heb het even ingekort, anders wordt het erg lang.
Kan iemand hier mij bij helpen?

Andere oplossingen hoor ik ook graag.

Bvd.
Groet, Johan
 
// ------------- Class Hoofd
import javax.swing.*;

public class Hoofd extends JFrame {

 private Bord bord;

 

 public static void main(String[] args){

  JFrame frame = new Hoofd();

  frame.setSize(1500,1000);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.setContentPane(new Bord(4,14));

  frame.setTitle("Title");

    

  frame.pack();

  frame.setVisible(true);

  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

 }

}
// --------Class Bord
import java.awt.BorderLayout;

import java.awt.Font;

import java.awt.GridLayout;

import javax.swing.*;

import javax.swing.border.Border;

import Rad_van_Fortuin.JButton_Icon_Status;

public class Bord extends JPanel {

 private JPanel paneelCentrum;

 private JButton[][] knoppen;

 private GeluidTEST geluid;

 

 public Bord(int rijen, int kolommen){

  setLayout(new BorderLayout());

  Font f2 = new Font("Arial", Font.BOLD,75);

  geluid = new GeluidTEST(); 

  Border groefRand = BorderFactory.createEtchedBorder();

  knoppen = new JButton[rijen][kolommen];

  paneelCentrum = new JPanel(new GridLayout(rijen, kolommen ));

  

  paneelCentrum.setBorder(groefRand);  

  for (int a=0; a<rijen;a++)

   for(int b=0; b<kolommen; b++){

    knoppen[a] = new JButton("*");

    knoppen[a].setFont(f2);

    knoppen[a].setHorizontalAlignment(JButton.CENTER);

    paneelCentrum.add(knoppen[a]);

   }

  add(paneelCentrum);

  

  for (int a=0; a<1;a++)

   for(int b=0; b<5; b++){

    knoppen[a].setText("P");

    paneelCentrum.revalidate();

    revalidate();

    knoppen[a].revalidate();

    geluid.speel();

    knoppen[a].repaint();

   }

 }

}
// ----------------------Class GeluidTest
import javax.sound.midi.*;

import java.util.concurrent.TimeUnit;

import javax.sound.sampled.UnsupportedAudioFileException;

public class GeluidTEST {

 private Sequencer player;

 private Sequence seq;

 private Track track;

 

 public GeluidTEST() {

  try{ 

   player = MidiSystem.getSequencer();

   player.open();

   

   seq = new Sequence(Sequence.PPQ,4);

   track = seq.createTrack();

      

   ShortMessage a = new ShortMessage();

   a.setMessage(144,1,44,100);

   MidiEvent noteOn = new MidiEvent(a,1);

   track.add(noteOn);

   

   ShortMessage b = new ShortMessage();

   b.setMessage(128,1,44,100); 

   MidiEvent noteOff = new MidiEvent(b,16);

   track.add(noteOff);

   player.setSequence(seq);

   //player.close();

 

  }

  catch (MidiUnavailableException e) {}

  catch(Exception e){ }

 }

 

  public void speel(){

  try{

   player.start(); 

   while (true){

    if (player.isRunning()){

     try {

                        Thread.sleep(100); // Check every second

                    } catch(InterruptedException ignore) {

                        break;

                    }

                } else {

                    break;

    }

   }

   player.stop();

   player.close();

   

  } catch (Exception e) { }

 } 

 

}

Berichten: 7.068

Re: Java: Bord met knopjes

Dingen die sowieso misgaan:

In Hoofd maak je eerst het bord en vervolgens maak je het frame pas zichtbaar. Dan zie je sowieso niks gebeuren.

In GeluidTest doe je player.close(). Daarmee sluit je de Sequencer en kun je dus niets meer spelen. Wat je wilt doen is de player weer terug naar het begin van de sequence zetten ("player.setMicrosecondPosition(0);")

Berichten: 10

Re: Java: Bord met knopjes

Beste EvilBro,
 
In de eerste plaats hartelijk dank.
Ik had even een rare kronkel.
Ik heb de code aangepast naar aanleiding van je tips.
Zo te zien werkt het.
 
Nu nog in mijn hoofdproggie gaan zetten.
Ik heb de aangepaste code onderaan neergezet.
 
Als je nog tips hebt hoor ik het graag van je.
 
Ik ben erg blij mee:)
 
Groetjes, Johan
 
 
 
 
import javax.swing.*;

public class Hoofd extends JFrame {

 private Bord bord;

 private JFrame frame;

 

 public static void main(String[] args){

  Hoofd hoofd = new Hoofd();

  hoofd.startSpel();

 }
 public void startSpel(){

  bord = new Bord(4,14);

  JFrame frame = new JFrame();

  frame.setSize(1500,1000);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.setTitle("Title");

    
  frame.setVisible(true);

  frame.setContentPane(bord);

  frame.pack();
  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

  frame.repaint();

  frame.revalidate();

  

  bord.plaatsLetters();

 }

}
//---------------
 
import java.awt.BorderLayout;

import java.awt.Font;

import java.awt.GridLayout;
import javax.swing.*;

import javax.swing.border.Border;
import Rad_van_Fortuin.JButton_Icon_Status;
public class Bord extends JPanel {

 private JPanel paneelCentrum;

 private JButton[][] knoppen;

 private GeluidTEST geluid;

 

 public Bord(int rijen, int kolommen){

  setLayout(new BorderLayout());

  Font f2 = new Font("Arial", Font.BOLD,75);

  geluid = new GeluidTEST(); 

  Border groefRand = BorderFactory.createEtchedBorder();

  knoppen = new JButton[rijen][kolommen];

  paneelCentrum = new JPanel(new GridLayout(rijen, kolommen ));

  

  paneelCentrum.setBorder(groefRand);  

  for (int a=0; a<rijen;a++)

   for(int b=0; b<kolommen; b++){

    knoppen[a] = new JButton("*");

    knoppen[a].setFont(f2);

    knoppen[a].setHorizontalAlignment(JButton.CENTER);

    paneelCentrum.add(knoppen[a]);

   }

  add(paneelCentrum);

  

 }
 public void plaatsLetters(){

  for (int a=0; a<1;a++)

   for(int b=0; b<5; b++){

    knoppen[a].setText("P");

    paneelCentrum.revalidate();

    revalidate();

    knoppen[a].revalidate();

    geluid.speel();

    knoppen[a].repaint();

   }

 }

}
 
 
//------------
 
import javax.sound.midi.*;

import java.util.concurrent.TimeUnit;
import javax.sound.sampled.UnsupportedAudioFileException;

public class GeluidTEST {

 private Sequencer player;

 private Sequence seq;

 private Track track;

 

 public GeluidTEST() {

  try{ 

   player = MidiSystem.getSequencer();

   //player.open();

   player.open();
   

   seq = new Sequence(Sequence.PPQ,4);
   track = seq.createTrack();

      

   ShortMessage a = new ShortMessage();

   a.setMessage(144,1,44,100);

   MidiEvent noteOn = new MidiEvent(a,1);

   track.add(noteOn);

   

   ShortMessage b = new ShortMessage();

   b.setMessage(128,1,44,100); 

   MidiEvent noteOff = new MidiEvent(b,16);

   track.add(noteOff);

   player.setSequence(seq);

   //player.close();

 

  }

  catch (MidiUnavailableException e) {}

  catch(Exception e){ }

 }
 public void speel(){

  try{

   player.start(); 

   while (true){

    if (player.isRunning()){

     try {

                        Thread.sleep(100); // Check every second

                    } catch(InterruptedException ignore) {

                        break;

                    }

                } else {

                    break;

    }

   }

   //player.stop();

   player.setMicrosecondPosition(0);

   //player.close();

   

  } catch (Exception e) { }

 } 
}

Berichten: 7.068

Re: Java: Bord met knopjes

Als je nog tips hebt hoor ik het graag van je.
Tip 1: Gebruik code-tags. :D

Je hebt bij een paar for-loops de {} weggelaten. Dit mag, maar ik ben er geen voorstander van. Het wordt daardoor onduidelijker wat er binnen de for-loop valt. Voorbeeld:

Code: Selecteer alles

String test = "";
for (int a = 0; a < 10; a++)
test = test + "?";
test = test + "!";
vs.

Code: Selecteer alles

String test = "";
for (int a = 0; a < 10; a++) {
test = test + "?";
}
test = test + "!";
Je hebt in jouw geluid-module een rare constructie zitten met een while, een if en een break. Dit kan makkelijker:

Code: Selecteer alles

while (true){    
    if (player.isRunning()){     
	try {                        
	    Thread.sleep(100);
        } catch(InterruptedException ignore) {                        
	    break;                    
	}                
    } else {                    
	break;    
    }
}
Dit kan als:

Code: Selecteer alles

while (player.isRunning()) {     
    try {                        
	Thread.sleep(100);
    } catch(InterruptedException ignore) {}                
}
Nog een dingetje: Je noemt de exception "ignore". Dit suggereert dat je niks gaat doen met de exception. Toch staat er code in jouw catch-clause. Dat is niet handig.

Wat ben je eigenlijk aan het maken?

Berichten: 10

Re: Java: Bord met knopjes

HI EvilBro,
 
Ik had de code wat ingekort.
De exceptions moeten ook nog verder worden uitgewerkt.
Ik had de code mbt het geluid gecopieerd van internet en uit een boek.
 
Mijn programma heeft wel iets weg van Rad van Fortuin. (zie bijlage)
Alleen deze heeft  iets meer vakjes.
Wil er ook meer uitdrukkingen en gezegdes in zetten. ( deze heb ik van Wikipedia)
 
Moet het grafisch nog wat aanpassen.
Daarna wil ik het omzetten naar een app.
 
Ik zie het ook meer als een oefening.
 
Bedankt voor je aanwijzingen.
 
Groetjes,
Johan
Bijlagen
woordspel.jpg
woordspel.jpg (80.41 KiB) 727 keer bekeken

Reageer