Valeur int dans la sourissed dans un JPANEL ne mettant pas à jour lorsque les changements INT
-
21-12-2019 - |
Question
Je codage une application pour imprimer des briques dans les grilles et je l'ai configuré de sorte que, idéalement, pour changer la couleur, la sélection du menu change un INT qui définit la couleur dans la classe de briques.
J'ai deux panneaux, un pour la grille (où les choses sont dessinées) et une pour la barre de menu.Si je modifie manuellement le nombre dans la grille, cela fonctionne, alors je pense que cela pourrait être un problème avec le menu, mais je ne suis pas sûr.Je me demande comment je peux obtenir l'INT du menu JPanel à la grille JPanel chaque fois que cela change.
Ceci est le code de menu:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Selector extends JPanel implements Common, ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
public Color colorValues[] = {Color.BLACK, Color.YELLOW, Color.RED, Color.ORANGE};
public String colors[] = {"Black", "Yellow", "Red", "Orange"};
public JMenuItem colorItems[];
public int display;
//constructor
public Selector(){
//set size and layout
setPreferredSize(new Dimension(SELECTOR_WIDTH, SELECTOR_HEIGHT));
setLayout(new BorderLayout());
//menu bar
JMenuBar bar = new JMenuBar();
Font f = new Font("Helvetica", Font.BOLD, 15);
//menus
JMenu colorMenu = new JMenu("Colour");
//create Color menu
String colors[] = {"Black", "Yellow", "Red", "Orange"};
colorItems = new JMenuItem[colors.length];
for (int i = 0; i<colors.length; i++){
colorItems [i] = new JMenuItem(colors[i]);
colorMenu.add(colorItems[i]);
colorItems[i].addActionListener(this);
}// end of for loop
//set all font the same
UIManager.put("Menu.font", f);
UIManager.put("MenuBar.font", f);
UIManager.put("MenuItem.font", f);
//add menus
bar.add(colorMenu);
//add menu bar
add(bar, BorderLayout.PAGE_START);
}//constructor end
public void actionPerformed(ActionEvent e){
if (e.getSource()==colorItems[0]){
display=0;
}
else if (e.getSource()==colorItems[1]){
display=1;
}
else if (e.getSource()==colorItems[2]){
display=2;
}
else if (e.getSource()==colorItems[3]){
display=3;
}
}
}//class end
Ceci est le code grille de carte:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MapGrid extends JPanel implements Common, MouseListener{
/**
*
*/
private static final long serialVersionUID = 1L;
//brick array
public Bricks [] brick = new Bricks[COLUMN*ROW];
//number array to save
public int [] cell = new int[COLUMN*ROW];
//coordinate variables
private int x=0;
private int y=0;
Selector s = new Selector();
//constructor
public MapGrid(){
//sets size, layout, and background colour
setPreferredSize(new Dimension(MAPGRID_WIDTH, MAPGRID_HEIGHT));
setLayout(new GridLayout(ROW, COLUMN));
addMouseListener(this);
//draws grid of bricks
for (int i = 0; i <COLUMN*ROW; i++){
cell[i] = 4;
if ((i%COLUMN==0)&&(i>COLUMN-1)){
x=0;
y+=22;
}
brick[i] = new Bricks(x,y);
x+=40;
}
}//constructor end
//draws bricks
public void paint(Graphics g){
super.paint(g);
for (int i = 0; i <COLUMN*ROW; i++){
brick[i].draw(g);
}
}//paint end
public void mousePressed(MouseEvent evt) {
//gets mouse and y coordinates
int x = evt.getX();
int y = evt.getY();
//gets column and row of mouse location
int c =x/BRICK_WIDTH;
int r =y/BRICK_HEIGHT;
//checks if mouse is within range
if ((c>=0&&c<=COLUMN)&&(r>=0&&r<=ROW)){
int index = (r)*COLUMN+c; //calculates brick number
//right click - delete brick
if (evt.isMetaDown()) {
brick[index].setChoice(4);
cell[index]=4;
}
//left click - draws brick
else{
brick[index].setChoice(s.display);
cell[index]=s.display;
}
}
repaint();
}//mousePressed end
//unused
public void mouseEntered(MouseEvent evt) {}
public void mouseExited(MouseEvent evt) {}
public void mouseClicked(MouseEvent evt) {}
public void mouseReleased(MouseEvent evt) {}
}//class end
Ceci est le code de briques:
import java.awt.*;
public class Bricks implements Common{
//variables
public int x=0;
public int y=0;
public int choice=3;
public boolean clear = true;
//size of bricks
private static final int width = BRICK_WIDTH;
private static final int height = BRICK_HEIGHT;
//constructor
public Bricks(int x, int y){
this.x=x;
this.y=y;
}//constructor end
//draw bricks
public void draw(Graphics g){
//set color or blank
switch(choice){
case 0: g.setColor(Color.BLACK);
break;
case 1: g.setColor(Color.YELLOW);
break;
case 2: g.setColor(Color.RED);
break;
case 3: g.setColor(Color.ORANGE);
break;
case 4: clear = true;
break;
}
//check if set blank
if (clear==true){
g.setColor(Color.BLACK);
g.drawRect(x,y,width,height);
}
else{
g.fillRect(x,y,width,height);
}
}//draw end
//set choice of color
public void setChoice (int c){
choice=c;
clear = false;
}//choice end
}//class end
La solution
Votre problème est ici:
public class MapGrid extends JPanel implements Common, MouseListener{
//...
Selector s = new Selector(); // ******* HERE **********
// ...
public void mousePressed(MouseEvent evt) {
// ....
else{
brick[index].setChoice(s.display);
cell[index]=s.display;
}
// ....
}
//...
}
Vous créez un nouvel objet sélecteur ci-dessus, mais il est probablement complètement distinct de l'objet Sélecteur qui est affiché dans votre interface graphique.Les modifications apportées à l'état du sélecteur détenu et affichées par l'interface graphique ne se refléteront pas dans l'objet Sélecteur que vous utilisez ci-dessus.
Pour résoudre ceci, assurez-vous que la variable de sélecteur fait référence à celle du même sélecteur affichée dans l'interface graphique.
E.g., changez-le à quelque chose comme si:
public class MapGrid extends JPanel implements Common, MouseListener{
//...
Selector s = null;
public MapGrid(Selector s) {
this.s = s;
}
// .... etc....
Et puis lorsque vous créez votre objet MapGrid, assurez-vous de transmettre une référence à l'instance de sélection true affichée.