1

グリッドにレンガを印刷するアプリケーションをコーディングしています。理想的には、色を変更するために、メニュー選択がレンガクラスの色を設定する int を変更するように設定しました。

2 つのパネルがあります。1 つはグリッド (描画される場所) 用で、もう 1 つはメニュー バー用です。グリッドの数字を手動で変更すると動くので、メニューの問題かと思いますがよくわかりません。メニュー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

これはマップ グリッドのコードです。

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
4

1 に答える 1

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 変数が、GUI に表示されているものと同じ Selector を参照していることを確認してください。

たとえば、次のように変更します。

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

    Selector s = null;

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

    // .... etc....

次に、MapGrid オブジェクトを作成するときに、表示された実際の Selector インスタンスへの参照を必ず渡します。

于 2013-11-16T05:46:57.730 に答える