Java: Bord met knopjes
Geplaatst: do 23 feb 2017, 13:42
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) { }
}
}
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) { }
}
}