2013-11-16 2 views
1

Я кодирую приложение для печати кирпичей в сетках, и я настроил его так, чтобы в идеале, чтобы изменить цвет, выбор меню изменяет int который устанавливает цвет в классе кирпичей.Значение Int в MousePressed в одном JPanel не обновляется при изменении Int

У меня есть две панели, одна для сетки (где вещи нарисованы) и одна для строки меню. Если я вручную изменю номер в сетке, он работает, поэтому я думаю, что это может быть проблемой с меню, но я не уверен. Мне интересно, как я могу получить 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 

Это код Карта Сетка:

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

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

@ Andrew Thompson Спасибо, что научили людей правильно спрашивать, но действительно странно видеть один и тот же коммент в каждом вопросе :( – iShaalan

+0

@iShaalan * «Спасибо, что научили людей правильно спрашивать» * Это не «правильно», но просто «полезно для получения ответов». Использование слова «правильный», особенно умный, см. в [этой теме] (http://meta.stackexchange.com/q/188511/155831) по причинам. –

ответ

2

Ваша проблема здесь:

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 относится к одному и тому же селектору, который отображается в графическом интерфейсе.

например, изменить его на что-то вроде этого:

public class MapGrid extends JPanel implements Common, MouseListener{ 
    //... 

    Selector s = null; 

    public MapGrid(Selector s) { 
     this.s = s; 
    } 

    // .... etc.... 

, а затем, когда вы создаете объект MapGrid, обязательно передать ссылку на отображаемом истинный экземпляр Selector.

+0

Я был вдали от Интернета сегодня. Спасибо за ответ. Это сработало для меня. – Toaster