Witam na forum w swoim pierwszym poście,
Piszę program, syntezator który generuje dźwięki.
Kreowanie dźwięku polega na manipulowaniu kontrolerami:
pokrętłami (klasa Knobs) i przyciskami (klasa Triggers) albo na wczytaniu gotowego presetu z JComboboxa, który zmienia odpowiednio stany wszystkich kontrolerów.
Mam problem z klasą Triggers, która jest po prostu JPanelem z czterema Buttonami i obrazkiem.
Obrazek się zmienia, w zależności który Button wciśnięty. Ten obrazek to coś jak takie świecące diody.
Tak to wygląda:
O ile wszystko ładnie działa klikając odpowiednio w Buttony lub kręcąc pokrętłami
to przy wczytaniu presetów z JComboboxa nie chcą się podmieniać te obrazki w klasie Triggers.
Pokrętła ładnie działają przy zmianie preseta z JCombobox.
W przypadku przycisków, jeśli się zmienia preset JComboboxem zmiana kontrolera następuje (zmienia się dźwięk)
lecz w JPanelu nie podmienia się własciwy obrazek.
Jako zarządcę rozkładu używam TableLayout.
Fragmenty kodu okna głównego Okno
//wcześniej zadeklarawano
private Triggers[] triggers = new Triggers[numTriggers];
private int numKnobs = 12;
private int numTriggers = 6;
private int ctrlKnobs[] = {24, 23, 8, 7, 16, 17, 18, 25, 26, 2, 1, 0}; // to są id kontrolerów, piewsze pokrętło jest kontrolerem id = 24
private int ctrlTriggers[] = {14, 15, 9, 10, 11, 12};// analogicznie jak wyżej
/*
* Fragmenty kodu z konstruktora Okno
*/
// triggers
for (int t = 0; t < numTriggers; t++) {
int tvalue = 1;
String tstr = Integer.toString(tvalue);
JPanel panelTrig = new JPanel(new BorderLayout());
etykieta[t] = new JLabel(tstr, 4);
panelTrig.add(etykieta[t]);
final JLabel et = etykieta[t];
triggers[t].addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
Triggers tr = (Triggers) e.getSource();
int vol;
vol = (int) tr.getValue();
et.setText(Integer.toString(vol));
}
});
panelTrig.add(triggers[t],BorderLayout.LINE_START);
frame.add(panelTrig, position[numKnobs + t]);
}
// JCOMBOBOX
JPanel pCombo = new JPanel();
pCombo.setLayout(new FlowLayout());
final JLabel[] jlbc = new JLabel[27];
for (int k=0; k<27;k++)// do JLabel przy JComboBox
{
pCombo.add(labcomb[k] = new JLabel(s, 4), BorderLayout.WEST);
jlbc[k]=labcomb[k];
}
PresetsCombo combo = new PresetsCombo();
combo.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
PresetsCombo presetcombo = (PresetsCombo) e.getSource();
int val, tval;
float fval;
//pokrętła (Knobs)
for (int col=0; col<numKnobs;col++)
{
val= (int) Math.round(presetcombo.getValue(ctrlKnobs[col]));//ok
jlbc[ctrlKnobs[col]].setText(Integer.toString(val));//jlabel combo
//synthesizer.setController(ctrlKnobs[col],val);// zmienia kontrolery
fval = ((float) val)/127;
ts[col].setValue(fval);
}
//przyciski (Triggers)
for (int tcol=0; tcol<numTriggers;tcol++)
{
tval = (int) presetcombo.getValue(ctrlTriggers[tcol]);//ok
jlbc[ctrlTriggers[tcol]].setText(Integer.toString(tval));//jlabel combo
//synthesizer.setController(ctrlTriggers[col],tval);// zmienia kontrolery = ok
etykieta[tcol].setText(Integer.toString(tval)); // jlabel gui pod przelacznikiem - pomocniczo
triggers[tcol].setValue(tval); // TU JEST COŚ NIE TAK
}
Klasę Triggers wklejam całą:
import layout.TableLayout;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Triggers extends JPanel
implements ActionListener, ItemListener {
public Triggers(String s[], String name) {
JPanel panel = new JPanel(new TableLayout(size));
this.value = Integer.parseInt(s[selected]);
for (int i = 0; i < s.length; i++) {
ImageIcon cup = new ImageIcon();
button[i] = new JButton(z[i], cup);
Font font = button[i].getFont();
button[i].setFont(new Font(font.getFontName(), font.getStyle(), 8));
button[i].setActionCommand(s[i]);
if (i == selected) {
button[i].setSelected(true);
} else {
button[i].setSelected(false);
}
}
ButtonGroup group = new ButtonGroup();
for (int i = 0; i < s.length; i++) {
group.add(button[i]);
button[i].addActionListener(this);
button[i].addItemListener(this);
}
diody = new JLabel(createImageIcon("/resources/diody/"
+ this.value
+ ".png"));
diody.setPreferredSize(new Dimension(16, 80));
JPanel triggs = new JPanel(new TableLayout(sizeB));
triggs.setPreferredSize(new Dimension(60, 90));
for (int i = 0; i < s.length; i++) {
triggs.add(button[i], positionTrig[i]);
}
panel.add(triggs, position[0]);
panel.add(diody, position[1]);
TitledBorder titledborder = BorderFactory.createTitledBorder(name);
titledborder.setTitleJustification(1);
panel.setBorder(titledborder);
add(panel);
}
public void actionPerformed(ActionEvent e) {
cmd = e.getActionCommand();
diody.setIcon(createImageIcon("/resources/diody/"
+ cmd
+ ".png"));
if (cmd.equals("1")) {
setValue(1);
} else if (cmd.equals("2")) {
setValue(2);
} else if (cmd.equals("3")) {
setValue(3);
} else if (cmd.equals("4")) {
setValue(4);
}
}
public static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = Triggers.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
public int setController() {
return value;
}
public void setValue(int k) {
this.value = k;
cmd = Integer.toString(this.value);
repaint();
fireChangeEvent();
}
public int getValue() {
return this.value;
}
public void setSel(int k) {
selected = k;
repaint();
fireChangeEvent();
}
public void itemStateChanged(ItemEvent ie) {
String s = (String) ie.getItem();
}
public void addChangeListener(ChangeListener cl) {
listenerList.add(ChangeListener.class, cl);
}
public void removeChangeListener(ChangeListener cl) {
listenerList.remove(ChangeListener.class, cl);
}
protected void fireChangeEvent() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) {
if (changeEvent == null) {
changeEvent = new ChangeEvent(this);
}
((ChangeListener) listeners[i + 1]).stateChanged(changeEvent);
}
}
}
private ChangeEvent changeEvent = null;
private EventListenerList listenerList = new EventListenerList();
private JLabel diody;
private int x = 1;
private int y = 4;
private JButton button[] = new JButton[y];
private String positionTrig[] = { //dane do TableLayout
"1, 1, 1, 1",
"1, 3, 1, 3",
"1, 5, 1, 5",
"1, 7, 1, 7"
};
private String position[] = {
"1, 1, 1, 1",
"3, 1, 3, 1"
};
double border = 4;
double vborder = 1;
int controller[] = new int[4];
String z[] = {"1", "2", "3", "4"};
double size[][] = {
{1, 0.75, 1, 0.25, 1},
{1, 0.9999, 1}
};
double sizeB[][] = {
{1, 0.9999, 1},
{4, 0.24, 2, 0.24, 2, 0.24, 2, 0.24, 1}
};
private int selected;
private int value;
private String cmd;
}
Czy rzuciłby ktoś swoim fachowym okiem co może być nie tak?