Значение Int в MousePressed в одной JPanel не обновляется при изменении Int
Я пишу приложение для печати блоков в сетках, и я настроил его так, чтобы в идеале для изменения цвета выбор меню изменял int, который устанавливает цвет в классе bricks.
У меня есть две панели, одна для сетки (где все нарисовано) и одна для строки меню. Если я вручную изменяю число в сетке, это работает, поэтому я думаю, что это может быть проблема с меню, но я не уверен. Мне интересно, как я могу получить int из меню jpanel в сетку jpanel, когда она меняется.
Это код меню:
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
Это код карты Grid:
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
это код кирпича:
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
1 ответ
Ваша проблема здесь:
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;
}
// ....
}
//...
}
Вы создаете новый объект Selector выше, но он, вероятно, полностью отличается от объекта Selector, который отображается в вашем графическом интерфейсе. Таким образом, изменения состояния селектора, удерживаемого и отображаемого в графическом интерфейсе, не будут отражены в объекте селектора, который вы используете выше.
Чтобы решить эту проблему, убедитесь, что переменная Selector ссылается на один и тот же Selector, который отображается в GUI.
например, измените его на что-то вроде этого:
public class MapGrid extends JPanel implements Common, MouseListener{
//...
Selector s = null;
public MapGrid(Selector s) {
this.s = s;
}
// .... etc....
и затем, когда вы создаете свой объект MapGrid, обязательно передайте ссылку на отображаемый истинный экземпляр Selector.