Hallo,
ich hab gesucht, gesucht und gesucht. Bei Google, als auch in diesem Forum und auch in der FAQ.
Nun zu meinem Problem: Ich habe einen kleinen Step Sequencer geschrieben, mit dem man ganz simple Schlagzeugloops eingeben und sich anhören kann. Das funktioniert soweit ganz gut. Nun möchte ich mithilfe eines ActionListeners eine Methode aufrufen, die eine Instanz von Track(erbt von JPanel) aufs JFrame zeichnet. Das Problem ist, dass dieses zwar hinzugefügt wird, aber erst sichtbar wird, sobald man die Größe ändert. das repaint(); vom JFrame aufzurufen nützt nichts Beim Aufrufen von removeTrack(); verschwindet der Track sofort. ???:L Ich bitte um Hilfe!
Hier ist der Code:
Die Klasse Track:
Die unwichtigen Klassen, die nur zum Ausführen notwendig sind:
ich hab gesucht, gesucht und gesucht. Bei Google, als auch in diesem Forum und auch in der FAQ.
Nun zu meinem Problem: Ich habe einen kleinen Step Sequencer geschrieben, mit dem man ganz simple Schlagzeugloops eingeben und sich anhören kann. Das funktioniert soweit ganz gut. Nun möchte ich mithilfe eines ActionListeners eine Methode aufrufen, die eine Instanz von Track(erbt von JPanel) aufs JFrame zeichnet. Das Problem ist, dass dieses zwar hinzugefügt wird, aber erst sichtbar wird, sobald man die Größe ändert. das repaint(); vom JFrame aufzurufen nützt nichts Beim Aufrufen von removeTrack(); verschwindet der Track sofort. ???:L Ich bitte um Hilfe!
Hier ist der Code:
Java:
package Main;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JButton;
import java.awt.Dimension;
public class LetsPlayTheDrums implements java.awt.event.ActionListener, Runnable {
JFrame win;
JMenuBar mb;
JMenu tracks;
JMenuItem tracksItem[];
JButton startStop [];
Track track[];
short activeTracks = 2;
boolean swing;
static LetsPlayTheDrums bla;
public static void main(String[] args) {
bla = new LetsPlayTheDrums();
}
public LetsPlayTheDrums() {
win = new JFrame("Let's play the drums");
win.setLayout(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setBounds(100,100,550,300);
mb = new JMenuBar();
tracks = new JMenu("Spuren");
tracksItem = new JMenuItem[2];
tracksItem[0] = new JMenuItem("Spur hinzufügen");
tracksItem[1] = new JMenuItem("Spur entfernen");
tracks.add(tracksItem[0]);
tracks.add(tracksItem[1]);
mb.add(tracks);
win.setJMenuBar(mb);
startStop = new JButton[2];
track = new Track[10];
for(int i = 0; i < track.length; i++) {
track[i] = new Track();
track[i].setBounds(0,(1 + i) * 40, 560, 40);
track[i].setPreferredSize(new Dimension(560,40));
}
win.add(track[0]);
win.add(track[1]);
startStop[0] = new JButton("Start");
startStop[1] = new JButton("Stop");
startStop[0].setBounds(5,5,100,30);
startStop[1].setBounds(110,5,100,30);
startStop[0].addActionListener(this);
startStop[1].addActionListener(this);
tracksItem[0].addActionListener(this);
tracksItem[1].addActionListener(this);
win.add(track[0]);
win.add(track[1]);
win.add(startStop[0]);
win.add(startStop[1]);
win.setVisible(true);
}
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
Object source = evt.getSource();
if(source.equals(startStop[0])) {
start();
}
else if(source.equals(startStop[1])) {
stop();
}
else if(source.equals(tracksItem[0])) {
addTrack();
}
else if(source.equals(tracksItem[1])) {
removeTrack();
}
win.repaint();
}
@Override
public void run() {
System.out.println("Starting Playback");
try {
while (true) {
int currentStep;
for (currentStep = 0; currentStep < 16; currentStep++) {
for(int i = 0;i < track.length; i++) {
if(track[i].activated[currentStep]) {
track[i].play();
}
}
Thread.sleep(125); // 16tel bei 120 bpm
}
}
} catch (InterruptedException e) {
System.out.println("Stopping Playback");
return;
}
}
Thread loop;
boolean started;
public void start() {
loop = new Thread(this);
if(!started) {
loop.start();
started = true;
}
}
public void stop() {
if(started) {
loop.interrupt();
started = false;
}
}
public void addTrack() {
if(activeTracks == 10) {
return; // to prevent ArrayIndexOutOfBoundsException
}
track[activeTracks] = new Track();
track[activeTracks].setBounds(0, (activeTracks + 1) * 40, 560, 40);
win.add(track[activeTracks]);
activeTracks++;
}
public void removeTrack() {
if(activeTracks == 0) {
return; // to prevent ArrayIndexOutOfBoundsException
}
win.remove(track[activeTracks - 1]);
activeTracks--;
}
}
Die Klasse Track:
Java:
package Main;
import java.awt.Color;
import javax.swing.*;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Graphics;
import java.io.File;
public class Track extends JPanel implements ActionListener {
static final long serialVersionUID = 1L;
CustomButton button[];
boolean activated [];
File soundFile;
Sound sound;
public Track() {
super();
this.setLayout(new FlowLayout(FlowLayout.LEFT));
setSize(new Dimension(540,40));
button = new CustomButton[17];
button[0] = new CustomButton("Datei wählen",-1);
button[0].setPreferredSize(new Dimension(120,30));
button[0].addActionListener(this);
add(button[0]);
activated = new boolean[16];
for(int i = 1; i < button.length; i++) {
button[i] = new CustomButton("", i - 1);
button[i].setPreferredSize(new Dimension(20,20));
button[i].addActionListener(this);
add(button[i]);
}
sound = new Sound(soundFile);
repaint();
}
@Override
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
CustomButton b = (CustomButton) source;
if(b.getBackground().equals(Color.white)) {
b.setBackground(Color.blue);
activated[b.step] = true;
if(this.hasSound()) {
sound.play();
}
}
else if(b.getBackground().equals(Color.blue)) {
b.setBackground(Color.white);
activated[b.step] = false;
}
else {
JFileChooser fc = new JFileChooser();
if(fc.showOpenDialog(Main.LetsPlayTheDrums.bla.win) == JFileChooser.APPROVE_OPTION) {
soundFile = fc.getSelectedFile();
sound.file = soundFile;
button[0].setText(soundFile.getName());
}
}
}
public void play() {
if(this.hasSound()) {
sound.play();
}
}
boolean hasSound() {
return sound.file != null;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
}
Die unwichtigen Klassen, die nur zum Ausführen notwendig sind:
Java:
package Main;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.*;
public class Sound {
private Clip clip;
private AudioFormat af;
private byte [] audio;
private int size;
public File file;
public Sound(String name) {
String p = System.getProperty("java.class.path");
String result[] = p.split(";");
p = result[0] + "/";
if(p.endsWith(".jar/")) {
file = new File(name);
}
else {
file = new File(p + name);
}
}
public Sound(File file) {
this.file = file;
}
public void play() {
try {
AudioInputStream audioInputStream;
audioInputStream = AudioSystem.getAudioInputStream(file);
af = audioInputStream.getFormat();
size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
audio = new byte[size];
DataLine.Info info = new DataLine.Info(Clip.class, af, size);
audioInputStream.read(audio, 0, size);
clip = (Clip) AudioSystem.getLine(info);
clip.open(af, audio, 0, size);
} catch (UnsupportedAudioFileException ex) {
System.out.println("Error: " + ex);
} catch (IOException ex) {
System.out.println("Error: " + ex);
} catch (LineUnavailableException ex) {
System.out.println("Error: " + ex);
}
clip.start();
}
public void stop() {
clip.stop();
}
}
Java:
package Main;
import javax.swing.JButton;
import java.awt.Color;
public class CustomButton extends JButton {
final static long serialVersionUID = 1L;
int step;
public CustomButton(String text, int nr) {
super(text);
step = nr;
if(nr != -1) {
setBackground(Color.WHITE);
}
}
}
Zuletzt bearbeitet: