Ich habe ein Programm, das ein 4x4 Gitter von Quadraten durch einen GridBagLayout Layout Manager anzeigt. 16 JLabels, die alle ein Quadrat enthalten, werden angezeigt. Wenn auf eines der Rechtecke geklickt wird, soll es durch ein JLabel ersetzt werden, das ein Bild enthält (z. B. einen Hut). Das Bild nimmt also die Stelle des angeklickten Rechtecks ein.JLabels kann nicht mit anderen JLabels mit GridBagLayout ersetzt werden
Im Moment passiert jedoch, dass das angeklickte Rechteck manchmal ersetzt wird. In anderen Fällen verschwindet das Rechteck, aber das Bild ersetzt es nicht. In anderen Fällen wird das Bild in einem Rechteck angezeigt, das zuvor angeklickt wurde, aber nur nach dem Klicken auf ein anderes Rechteck. Ich habe den relevantesten Code unten angegeben.
public void displayGrid() {
c.gridx = 0;
c.gridy = 0;
try {
squareImage = ImageIO.read(this.getClass().getResource("stimulus(0).gif")); //line 37
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JLabel squareLabel = new JLabel(new ImageIcon(squareImage));
for(int i = 0; i < 16; i++){
c.gridx = i % 4;
c.gridy = i/4;
squareLabel = new JLabel(new ImageIcon(squareImage));
squareLabels[i] = squareLabel;
panel.add(squareLabels[i], c);
squareLabels[i].addMouseListener(this);
System.out.println(c.gridx + "" + c.gridy);
}
panel.validate();
}
public void mousePressed(MouseEvent e) {
for(int i = 0; i < squareLabels.length; i++){
if(e.getSource() == squareLabels[i]){
//JLabel removedLabel = squareLabels[i];
c.gridx = (i/4);
c.gridy = (i%4);
panel.remove(squareLabels[i]);
panel.revalidate();
panel.repaint();
panel.add(stimuliLabels[0], c);
panel.validate();
}
}
}
Im mouse() -Methode, habe ich versucht, Code zu schreiben, der die JLabel bestimmt, die gedrückt wird, erhält die GridBagConstraints dieser JLabel, entfernt die JLabel, die auf geklickt wird, und ersetzt dann das JLabel mit der neues JLabel mit den gegebenen GridBagConstraints. Wie ich bereits gesagt habe, funktioniert das Programm nicht wie geplant und ich weiß nicht warum.
Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen. Jede Hilfe wäre willkommen.
Weiß nicht, warum ich nicht gedacht hätte. Vielen Dank. Was meinst du mit "mit der Bibliothek arbeiten, nicht dagegen?" – lb91
@ lb91: Da JLabels zum Tausch von Icons gebaut wurden, ist es so einfach mit ihnen zu arbeiten, es beinhaltet so wenig Aufwand für den Programmierer, es gibt keine Notwendigkeit, neu zu lackieren, zu entfernen, hinzuzufügen, ... alles, was Sie tun müssen ist 'setIcon (...)' das ist es. Es ist eine natürliche Ergänzung für die Bibliothek. –
Ich habe mich gerade daran erinnert, warum ich versuchte, das JLabel zu ändern. Der Grund war, weil ich nicht wusste, wie man feststellt, dass ein Rechteck bereits angeklickt wurde (ich möchte nur, dass jedes Rechteck einmal angeklickt wird). Das JPanel entfernt alle Komponenten, wenn auf 4 Rechtecke geklickt wurde. Ich kann jedoch nicht feststellen, dass ein JLabel bereits einmal angeklickt wurde, wenn ich nur das Symbol ändere. – lb91