Comment dessiner une grille à l'aide de swing classe Java et de détecter la position de la souris lors d'un clic et faites-la glisser
Je suis en train de créer une grille de l'INTERFACE utilisateur (5*5) à l'aide de Swing classes. J'ai essayé avec une boucle imbriquée et l'ajout d'un composite de façon dynamique à la jFrame. Et j'ai aussi essayé de changer la couleur de fond de chaque composite lorsque l'utilisateur clique et tombe sur elle.
Mais avec mon code il y a un fossé énorme entre chaque cellule et je ne peux pas obtenir de l'événement glisser au travail.
public class clsCanvasPanel extends JPanel {
private static final int intRows = 5;
private static final int intCols = 5;
private List<JPanel> jpllist = new ArrayList<JPanel>();
public clsCanvasPanel() {
/*
*
* Add eventListener to individual JPanel within CanvasPanel
*
*
* TODO :
* 1) mousePressed --> update Temperature and HeatConstant of clsElement Class
* 2) start a new thread and
* 3) call clsElement.run() method
*
*
* Right Now : it updates the colours of the JPanel
* */
MouseListener mouseListener = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JPanel panel = (JPanel) e.getSource();
Component[] components = panel.getComponents();
for (Component component : components) {
component.setVisible(!component.isVisible());
component.setBackground(new Color(255,255,0));
}
panel.revalidate();
panel.repaint();
}
};
//TODO : refactoring
GridLayout gdlyPlates = new GridLayout();
gdlyPlates.setColumns(intCols);
gdlyPlates.setRows(intRows);
gdlyPlates.setHgap(0);
gdlyPlates.setVgap(0);
setLayout(gdlyPlates);
//TODO : refactoring
for (int row = 0; row < intRows; row++) {
for (int col = 0; col < intCols; col++) {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
JPanel jl = new JPanel();
jl.setVisible(true);
panel.add(jl);
panel.addMouseListener(mouseListener);
jpllist.add(panel);
add(panel);
}
}
}
}
Alors maintenant, je suis en train de créer un panneau et dessiner des grilles sur elle, puis détecte la position de la souris sur la grille, en plus de changer la couleur de chaque cellule.
Quelqu'un pourrait me donner quelques conseils sur la façon de mettre en œuvre cette grille sur un Composite, et changer la couleur d'un cellulaire.
Vous devez vous connecter pour publier un commentaire.
Il ya un certain nombre de façons d'obtenir ce travail, selon ce qu'il est que vous voulez atteindre.
Ce premier exemple utilise simplement les Graphismes en 2D API pour rendre les cellules et un
MouseMotionListener
pour surveiller lequel la cellule est mise en surbrillance.Cet exemple n'redimensionner la grille à la fenêtre, mais il serait trivial de changement pour faire des cellules de taille fixe.
Découvrez Graphismes en 2D pour plus de détails
Mise à jour avec le composant exemple
Cet exemple utilise une série de
JPanel
s pour représenter chaque cellule.Chaque cellule est définie avec une largeur fixe et de la hauteur et de ne pas redimensionner la fenêtre principale.
Dans cet exemple, chaque panneau de cellules a son propre écouteur de souris. Il ne serait pas trop difficile de modifier le code afin que le panneau principal avait un seul écouteur de souris et géré la charge de travail elle-même.
columnCount
etrowCount
valeurs?rowCount
est de 36MouseListener
n'était pas prêter attention à cetteJe n'ai pas aimé le rendu de frontières depuis l'intérieur de la grille certains ont été reproduites, s'il n'y avait plus que l'exemple. Je pense que cette solution est la meilleure:
Edit:
Ma solution est la meilleure, parce que si le code original sera 5x5 cellules, mais d'autres comme le 10x10 ... bords intérieurs de certaines cellules seront en contact et de créer des lieux d'épaisseur de la grille. C'est agréable de voir sur la capture d'écran
épaisseur de la grille
Dans le MouseListener exemple dans le mouseMoved méthode, vous pourriez envisager de l'xOffset/yOffset bien que pour faciliter la reconnaissance des cellules.