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
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top