Int Value in Mousepressed in One Jpanel che non si aggiorna quando l'int cambia
-
21-12-2019 - |
Domanda
Sto codificando un'applicazione per stampare mattoni nelle griglie, e l'ho impostato in modo che idealmente, per cambiare il colore, la selezione del menu cambia un INT che imposta il colore nella classe Bricks.
Ho due pannelli, uno per la griglia (dove vengono disegnate le cose) e una per la barra dei menu.Se cambino manualmente il numero nella griglia, funziona, quindi penso che potrebbe essere un problema con il menu, ma non ne sono sicuro.Mi chiedo come posso ottenere l'int dal menu Jpanel alla griglia Jpanel ogni volta che cambia.
Questo è il codice 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
.
Questo è il codice della griglia della mappa:
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
.
Questo è il codice del mattone:
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
. Soluzione
Il tuo problema è qui:
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;
}
// ....
}
//...
}
.
Stai creando un nuovo oggetto Selector sopra, ma è probabile che sia completamente distinto dall'oggetto del selettore che viene visualizzato nella GUI.Quindi le modifiche allo stato del selettore detenute e visualizzate dalla GUI non si rifletterà nell'oggetto del selettore che stai usando sopra.
Per risolvere questo, assicurarsi che la variabile del selettore si riferisca allo stesso e stesso selettore che viene visualizzato nella GUI.
e.g., cambialo in qualcosa di simile:
public class MapGrid extends JPanel implements Common, MouseListener{
//...
Selector s = null;
public MapGrid(Selector s) {
this.s = s;
}
// .... etc....
.
E poi quando si crea il tuo oggetto MapGRID, assicurarsi di passare in un riferimento all'istanza del selettore True Selector visualizzato.