2017-08-05 14 views
0

私はセルのグリッドを描画しているプログラムに取り組んでいます。各セルには色との4つの状態のいずれかに指定しました:初めにグリッドセルの色をクリックして変更する

  1. STARTCELL //marked by yellow color 
    
  2. ENDCELL //marked by red color 
    
  3. EMPTYCELL //marked by white color 
    
  4. BLOCKEDCELL // marked by black color 
    

は、1個の黄色のセル、および1個の赤のセルがあると残りは白です。

私はそれらをクリックすることで、セルの色や状態を変更できるようにしたかったし、いくつかの研究の後、私は解決策を見つけた:

@Override 
public void mouseClicked(MouseEvent e) { 
    // TODO Auto-generated method stub 
    for (Cell item : gridCells) { 
     if (item.getCellShape().contains(e.getPoint())&& item.getCellState()==CellState.EMPTYCELL) { 
      item.setCellColor(mouseColor); 
      if(mouseColor==startCellColor){ 
       item.setCellState(CellState.STARTCELL); 
      }else if(mouseColor==endCellColor){ 
       item.setCellState(CellState.ENDCELL); 
      }else{ 
       item.setCellState(CellState.BLOCKEDCELL); 
      } 
     } 
    } 
    repaint(); 
} 

唯一の問題は一つだけSTARTCELL と1があるはずですその時点でENDCELLがあり、クリックされていないセルの状態を正しく変更する方法が見つかりません。

私は何度も試してみましたし、これで終わった:

@Override 
public void mouseClicked(MouseEvent e) { 
    // TODO Auto-generated method stub 
    for (Cell item : gridCells) { 
     if (item.getCellShape().contains(e.getPoint())&& item.getCellState()==CellState.EMPTYCELL) { 
      item.setCellColor(mouseColor); 
      if(mouseColor==startCellColor){ 
        gridCells.get(numberOfStartCell-1).setCellColor(cellColor); 
        gridCells.get(numberOfStartCell-1).setCellState(CellState.EMPTYCELL); 
        numberOfStartCell=item.getNumberOfCell(); 
        item.setCellState(CellState.STARTCELL); 
      }else if(mouseColor==endCellColor){ 
       item.setCellState(CellState.ENDCELL); 
      }else{ 
       item.setCellState(CellState.BLOCKEDCELL); 
      } 
      areaTest.setText(Integer.toString(numberOfStartCell)); 
     } 
    } 
    repaint(); 
} 

残念ながら、それが正常に動作しません。最初のクリック後、新しいセルの色が黄色に変わり、古いセルが白くなり、変数numberOfStartCellの値も変わります。しかし、2回目のクリックなどの後で、変更する部分はnumberOfStartCellです。

ここはMCVです: 私が推測する最初の2つのクラスで何も説明するものはありません。

Class Main

import java.awt.EventQueue; 

public class Main { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new MyFrame(); 
      } 
     }); 
    } 
} 

Class MyFrame

import java.awt.Dimension; 
import java.awt.Toolkit; 

import javax.swing.JFrame; 

public class MyFrame extends JFrame { 

    int width = 750; 
    int height = 750; 
    MyPanel panel; 

    public MyFrame() { 
     super("Przeszukiwanie"); 
     setSize(width,height); 
     setResizable(false); 

     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     double screenWidth = screenSize.getWidth(); 
     double ScreenHeight = screenSize.getHeight(); 
     int x = ((int)screenWidth-width)/2; 
     int y = ((int)ScreenHeight-height)/2; 

     setLocation(x,y); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     panel=new MyPanel(); 
     add(panel); 
     pack(); 
    } 
} 

Class MyPanelイベント処理とGUIの世話をします。

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextField; 

public class MyPanel extends JPanel implements ActionListener{ 

    private JButton createButton; 

    private ButtonGroup cellColorGroup; 
    private JRadioButton startingNode; 
    private JRadioButton endingNode; 
    private JRadioButton obstacleNode; 

    private JTextField rows; 
    private JTextField columns; 

    private JLabel labelRows; 
    private JLabel labelColumns; 

    private String strRowsField; 
    private String strColumnsField; 

    private JPanel panelButtons; 
    private GridPanel panelGrid; 
    private JPanel panelSettings; 

    public MyPanel(){ 

     setPreferredSize(new Dimension(700, 600)); 
     setLayout(new BorderLayout()); 

     strRowsField="10"; 
     strColumnsField="10"; 

     panelButtons=new JPanel(); 
     panelSettings=new JPanel(); 
     panelGrid=new GridPanel(Integer.parseInt(strColumnsField),Integer.parseInt(strRowsField)); 

     panelSettings.setLayout(new GridLayout(6,2)); 

     createButton= new JButton("Create"); 

     cellColorGroup=new ButtonGroup(); 
     startingNode=new JRadioButton("Strating Node"); 
     endingNode=new JRadioButton("Ending Node"); 
     obstacleNode=new JRadioButton("Remove/Add Obstacle", true); 

     cellColorGroup.add(startingNode); 
     cellColorGroup.add(endingNode); 
     cellColorGroup.add(obstacleNode); 

     createButton.addActionListener(this); 
     startingNode.addActionListener(this); 
     endingNode.addActionListener(this); 
     obstacleNode.addActionListener(this); 

     columns=new JTextField(strColumnsField,2); 
     rows=new JTextField(strRowsField,2); 
     labelRows=new JLabel("Number of rows"); 
     labelColumns= new JLabel("Number of columns"); 

     panelButtons.add(createButton); 

     panelSettings.add(labelColumns); 
     panelSettings.add(columns); 
     panelSettings.add(labelRows); 
     panelSettings.add(rows); 
     panelSettings.add(startingNode); 
     panelSettings.add(endingNode); 
     panelSettings.add(obstacleNode); 

     add(panelButtons,BorderLayout.SOUTH); 
     add(panelGrid,BorderLayout.WEST); 
     add(panelSettings,BorderLayout.EAST); 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == createButton) { 
      panelGrid.setcNodes(Integer.parseInt(columns.getText())); 
      panelGrid.setrNodes(Integer.parseInt(rows.getText())); 
      panelGrid.getGridCells().clear(); 
      panelGrid.repaint(); 
     }else if(e.getSource() == startingNode){ 
      panelGrid.setMouseColor(panelGrid.getStartCellColor()); 

     }else if(e.getSource() == endingNode){ 
      panelGrid.setMouseColor(panelGrid.getEndCellColor()); 

     }else if(e.getSource() == obstacleNode){ 
      panelGrid.setMouseColor(panelGrid.getObstacleCellColor()); 
     } 
    } 
} 

Class GridPanelはノード、エッジ、セルを描画します。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.geom.Line2D; 
import java.awt.geom.Rectangle2D; 
import java.util.ArrayList; 

import javax.swing.JPanel; 

public class GridPanel extends JPanel implements MouseListener, MouseMotionListener { 

    private int cNodes;//Number of nodes across 
    private int rNodes;//Number of nodes along 
    private int nodeX;//X coordinate of the first node 
    private int nodeY;//Y coordinate of the first node 
    private int width=330; 
    private int height=330; 
    private int circleX;//Center of circle X 
    private int circleY;//Center of circle Y 
    private Color cellColor; 
    private Color startCellColor; 
    private Color endCellColor; 
    private Color obstacleCellColor; 
    private Color mouseColor; 
    private int numberOfStartCell; 

    private ArrayList<Cell> gridCells; 
    public GridPanel(int cNodes, int rNodes){ 

     setPreferredSize(new Dimension(width,height)); 

     this.cNodes=cNodes; 
     this.rNodes=rNodes; 

     if(cNodes>rNodes){ 
      nodeX=width/(cNodes+1);//Calculation of the x coordinate value of the first node 
      nodeY=height/(cNodes+1);//Calculation of the y coordinate value of the first node 
     }else{ 
      nodeX=width/(rNodes+1); 
      nodeY=height/(rNodes+1); 
     } 

     circleX=nodeX; 
     circleY=nodeY; 

     cellColor=Color.WHITE; 
     startCellColor=Color.YELLOW; 
     endCellColor=Color.RED; 
     obstacleCellColor=Color.BLACK; 

     gridCells=new ArrayList<Cell>(); 

     addMouseListener(this); 
     addMouseMotionListener(this); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     drawCells(g2d); 

    } 

    public void drawCells(Graphics2D g2d){ 
     int number=0; 
     int c=0; 
     for(int i=0; i<rNodes; i++){ 
      for(int j=0; j<cNodes; j++){ 
       number++; 
       if(i==0 && j==cNodes-1){ 
        gridCells.add(new Cell(circleX,circleY,nodeX,endCellColor,new Rectangle2D.Double(circleX-(nodeX/2),circleY-(nodeX/2),nodeX,nodeX),CellState.ENDCELL,number)); 

       } 
       else if(i==rNodes-1 && j==0){ 
        gridCells.add(new Cell(circleX,circleY,nodeX,startCellColor,new Rectangle2D.Double(circleX-(nodeX/2),circleY-(nodeX/2),nodeX,nodeX),CellState.STARTCELL,number)); 
       numberOfStartCell=number; 
       } 
       else { 
        gridCells.add(new Cell(circleX,circleY,nodeX,cellColor,new Rectangle2D.Double(circleX-(nodeX/2),circleY-(nodeX/2),nodeX,nodeX),CellState.EMPTYCELL,number)); 
       } 
       g2d.setPaint(gridCells.get(c).getCellColor()); 
       g2d.fill(gridCells.get(c).getCellShape()); 
       g2d.setPaint(Color.BLACK); 
       g2d.draw(gridCells.get(c).getCellShape()); 
       if(j<(cNodes-1)){ 
        circleX+=nodeX; 
       } 
       c++; 
      } 
      circleX=nodeX; 
      if(i<(rNodes-1)){ 
       circleY+=nodeY; 
      } 
     } 
     circleX=nodeX; 
     circleY=nodeY; 
    } 

    public void setMouseColor(Color mouseColor) { 
     this.mouseColor = mouseColor; 
    } 

    public void setcNodes(int cNodes) { 
     this.cNodes = cNodes; 
    } 

    public void setrNodes(int rNodes) { 
     this.rNodes = rNodes; 
    } 

    public Color getObstacleCellColor() { 
     return obstacleCellColor; 
    } 

    public Color getStartCellColor() { 
     return startCellColor; 
    } 

    public Color getEndCellColor() { 
     return endCellColor; 
    } 

    public ArrayList<Cell> getGridCells() { 
     return gridCells; 
    } 

    @Override 
    public void mouseDragged(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseMoved(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 
     for (Cell item : gridCells) { 
      if (item.getCellShape().contains(e.getPoint())&& item.getCellState()==CellState.EMPTYCELL) { 
       item.setCellColor(mouseColor); 
       if(mouseColor==startCellColor){ 
         gridCells.get(numberOfStartCell-1).setCellColor(cellColor); 
         gridCells.get(numberOfStartCell-1).setCellState(CellState.EMPTYCELL); 
         numberOfStartCell=item.getNumberOfCell(); 
         item.setCellState(CellState.STARTCELL); 
       }else if(mouseColor==endCellColor){ 
        item.setCellState(CellState.ENDCELL); 
       }else{ 
        item.setCellState(CellState.BLOCKEDCELL); 
       } 
      } 
     } 
     repaint(); 
    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mousePressed(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 
} 

Class Cellには、セル(状態、色、番号など)に関する情報があります。

import java.awt.Color; 
    import java.awt.Rectangle; 
    import java.awt.Shape; 
    import java.awt.geom.AffineTransform; 
    import java.awt.geom.PathIterator; 
    import java.awt.geom.Point2D; 
    import java.awt.geom.Rectangle2D; 

    public class Cell implements Shape{ 

     private int centerX; 
     private int centerY; 
     private double side; 
     private Color cellColor; 
     private double x; 
     private double y; 
     private Shape cellShape; 
     private CellState cellState; 
     private int numberOfCell; 

     public Cell(int centerX, int centerY, int side, Color cellColor,Shape cellShape, CellState cellState,int numberOfCell){ 
      super(); 
      this.centerX=centerX; 
      this.centerY=centerY; 
      this.side=side; 
      this.cellColor=cellColor; 
      this.cellShape=cellShape; 
      this.cellState=cellState; 
      this.numberOfCell=numberOfCell; 
     } 
    public Shape getCellShape() { 
     return cellShape; 
    } 

    public int getNumberOfCell() { 
     return numberOfCell; 
    } 

    public Color getCellColor() { 
     return cellColor; 
    } 

    public void setCellColor(Color cellColor) { 
     this.cellColor = cellColor; 
    } 

    public void setCellShape(Shape cellShape) { 
     this.cellShape = cellShape; 
    } 

    public double getSide() { 
     return side; 
    } 
    public double getX() { 
     return x; 
    } 
    public double getY() { 
     return y; 
    } 
    public CellState getCellState() { 
     return cellState; 
    } 

    public void setCellState(CellState cellState) { 
     this.cellState = cellState; 
    } 

    @Override 
    public boolean contains(Point2D p) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
    @Override 
    public boolean contains(Rectangle2D r) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
    @Override 
    public boolean contains(double x, double y) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
    @Override 
    public boolean contains(double x, double y, double w, double h) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
    @Override 
    public Rectangle getBounds() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public Rectangle2D getBounds2D() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public PathIterator getPathIterator(AffineTransform at) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public PathIterator getPathIterator(AffineTransform at, double flatness) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public boolean intersects(Rectangle2D r) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
    @Override 
    public boolean intersects(double x, double y, double w, double h) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

Class CellState

public enum CellState { 

    STARTCELL,ENDCELL,EMPTYCELL,BLOCKEDCELL; 
} 
+1

提案:1)あなたのプログラムにMVC構造体を使用しようとする、2)コードを有効な[mcve]に展開し、ここにコードを投稿してコンパイルして実行し、問題を最初に経験し、それを理解します。はい、これはあなたに余計な努力を払う**ロット**を求めていますが、それはあなたの質問を多く**簡単に答えさせるので、長期的にはあなたを助けます**。 –

+0

.............こんにちは? –

+0

ありがとうございます。できるだけ早くMCVEを追加します。よろしく。 –

答えて

0

私はないあなたのMCVEせずに、章や詩答えを与えることはできませんが、私はあなたに大きな示唆を与えることができます。空のブロックされたセルとブロックされたセルを選択することは、論理的には開始セルと終了セルを選択することとは非常に異なることに注意してください。私がやることは、マウスのリスナーにあり、どのボタンが押されているかを確認します。左ボタン(標準ボタン)の場合、セルのブロック/空の状態を切り替えます(ただし、開始または終了セルでない場合のみ)。マウスの右ボタンが押された場合(またはマウスボタンがない場合はalt-mouse)、ポップアップメニューを表示して、セルを開始セルまたは終了セルとして選択できるようにします。開始または終了を選択するためのコードは、空/ブロックトグルコードとは別に、最初にモデルを反復し、前の開始または終了セルを消去してから設定します。

より完全なソリューションをご希望の場合は、有効なMinimal, Complete, and Verifiable exampleコードをご質問(リンクではありません)とともにここに投稿してください。

Luck。

関連する問題