当Int更改时,MousePressed中的Int值在一个JPanel中不更新

时间:2013-11-16 05:28:30

标签: java swing menubar actionevent mousepress

我正在编写一个应用程序来在网格中打印砖块,我已经设置好了,理想情况下,要更改颜色,菜单选择会更改一个int,它会在砖类中设置颜色。

我有两个面板,一个用于网格(用于绘制内容),另一个用于菜单栏。如果我手动更改网格中的数字,它可以工作,所以我认为它可能是菜单的问题,但我不确定。我想知道每当它改变时我如何从菜单jpanel到网格jpanel获取int。

这是菜单代码:

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

这是Map 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 个答案:

答案 0 :(得分: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对象,但它可能与GUI中显示的Selector对象完全不同。因此,GUI所保持和显示的Selector状态的更改不会反映在您上面使用的Selector对象中。

要解决此问题,请确保Selector变量引用GUI中显示的同一个Selector。

例如,将其更改为:

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

    Selector s = null;

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

    // .... etc....

然后在创建MapGrid对象时,请务必传入对显示的真实Selector实例的引用。