J'essaie d'obtenir des graphiques tracés pour actualiser/repeupler lorsque l'utilisateur choisit chacune des différentes options dans un JComboBox. Les exemples que j'ai trouvés sur le web utilisent tous des JLabels, ce qui peut convenir aux fichiers image, mais qui ne fonctionnent pas avec les graphiques personnalisés créés par paintComponent.repaint de JComboBox contrôle
J'ai essayé de rouler ma propre solution dans les ~ 60 lignes de code ci-dessous. J'utilise un exemple trivial d'un rectangle à redimensionner. Si vous compilez et exécutez le code ci-dessous, vous verrez qu'il ne repeint pas lorsque l'utilisateur sélectionne différentes options de JComboBox. En outre, je n'ai délibérément pas encore fait quoi que ce soit avec displayConstraints, car je ne veux pas imposer une solution si quelqu'un a une meilleure approche. Mon objectif est que le JComboBox soit affiché dans sa propre rangée en haut, et que le graphique tracé soit fait dans une deuxième rangée beaucoup plus grande sous la première rangée. La deuxième ligne absorbera tous les changements de redimensionnement, tandis que la première rangée restera plus ou moins de la même taille lorsque le JFrame est redimensionné. En choisissant différentes options de JComboBox, l'utilisateur sera en mesure de rendre le rectangle tracé plus petit ou plus grand par rapport à la taille actuelle du JFrame. Est-ce que quelqu'un peut me montrer comment réparer le code ci-dessous afin qu'il accomplisse mes buts mentionnés ci-dessus?
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class ComboBox extends JFrame implements ItemListener {
final String[] sizes = { "10%", "20%", "33%" };
JComboBox combobox = new JComboBox(sizes);
int selectedIndex;
public ComboBox() {
setLayout(new GridBagLayout());
combobox.setSelectedIndex(-1);
combobox.addItemListener(this);
GridBagConstraints comboBoxConstraints = new GridBagConstraints();
comboBoxConstraints.gridx = 0;
comboBoxConstraints.gridy = 0;
comboBoxConstraints.gridwidth = 1;
comboBoxConstraints.gridheight = 1;
comboBoxConstraints.fill = GridBagConstraints.NONE;
add(combobox,comboBoxConstraints);//This should be placed at top, in middle.
GridBagConstraints displayConstraints = new GridBagConstraints();
displayConstraints.gridx = 0;
displayConstraints.gridy = 1;
displayConstraints.gridwidth = 1;
displayConstraints.gridheight = 1;
displayConstraints.fill = GridBagConstraints.BOTH;
//I am aware that nothing is done with displayConstraints.
//I just want to indicate that the rectangle should go below the combobox,
//and that the rectangle should resize while the combobox should not.
//Other suggested approaches are welcome.
setSize(300, 300);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {new ComboBox();}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
JComboBox combo = (JComboBox) e.getSource();
selectedIndex = combo.getSelectedIndex();
System.out.println("selectedIndex is: "+selectedIndex);
repaint();
}
}
protected void paintComponent(Graphics g){
int scaleFactor = 1;
if(selectedIndex==0){scaleFactor = 10;}
if(selectedIndex==1){scaleFactor = 5;}
if(selectedIndex==2){scaleFactor = 3;}
if(selectedIndex!=-1){
int xStart = (getWidth()/2)-(getWidth()/scaleFactor);
int yStart = (getHeight()/2)-(getHeight()/scaleFactor);
g.drawRect(xStart, yStart, (getWidth()/scaleFactor), (getHeight()/scaleFactor));
}
}
}
question était bien avant l'édition – CodeMed
Vous pouvez annuler la modification, mais il semble OK maintenant. – trashgod