2016-11-21 51 views
1

我在一个JPanel上绘制了一个Stratego板,用来设置玩家的棋子。在这些面板的两个不同的实例被玩家正确安排后,主板(具有相同的格式和布局,只是将具有不同的棋子外观和逻辑行为)将显示。用额外宽度绘制的JPanel

我的问题是,第二个输入面板和主板(目前没有功能或其上的零​​件)是在底部和右侧设置了额外宽度的SOMETIMES,导致10x10网格不占用整个电路板空间都应该如此。

玩家1的初始输入面板似乎工作正常,从来没有这个问题。第二个面板和主面板只有有时有这个问题,所以我不完全确定这是源于哪里。

这是设置面板和东西的主要方法。

public class Core { 

    public static void main(String[] args) { 

     LogicInterpreter logic = new LogicInterpreter(); 

     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 

     InputFrame inputPlayer1 = new InputFrame(logic, 1, "red", 600, 600); 
     inputPlayer1.setLocation(dim.width/2 - inputPlayer1.getSize().width/2, 
      dim.height/2 - inputPlayer1.getSize().height/2); 

     while(!logic.isSetUp1()){ 
      //Just to make it work 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     //Now bring up board 2 

     InputFrame inputPlayer2 = new InputFrame(logic, 2, "blue", 600, 600); 
     inputPlayer2.setLocation(dim.width/2 - inputPlayer2.getSize().width/2, 
       dim.height/2 - inputPlayer2.getSize().height/2); 

     while(!logic.isSetUp2()){ 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     openBoards(logic); 
    } 

    public static void openBoards(LogicInterpreter logic) { 
     try { 
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
      MainBoard board = new MainBoard(logic); 
      board.setLocation(dim.width/2 - board.getSize().width/2, dim.height/2 - board.getSize().height/2); 
     } catch (Exception e) { 
      System.exit(1); 
     } 
    } 
} 

此外,这里是输入面板内的代码。我不确定什么是相关的,所以我不能把东西拿出来。抱歉。我将扣留主板设置代码,因为它确实是相同的。

public class InputFrame extends JFrame { 
    private static final long serialVersionUID = 1L; 
    private LogicInterpreter holder; 
    private Panel2 jp; 
    private int height, width; 
    private Map<Integer, ArrayList<Integer>> lakeCoords = new HashMap<>(); 
    private List<Piece> pieces = new ArrayList<>(); 
    private int playernumber; 
    private String playerColor; 
    Piece selectedPiece; 
    Piece secondSelectedPiece; 
    boolean hidePieces = false; 

    JButton submit = new JButton("SUBMIT"); 

    public void addCoords() { 
     lakeCoords.put(3, new ArrayList<Integer>(Arrays.asList(6, 5))); 
     lakeCoords.put(4, new ArrayList<Integer>(Arrays.asList(6, 5))); 
     lakeCoords.put(7, new ArrayList<Integer>(Arrays.asList(6, 5))); 
     lakeCoords.put(8, new ArrayList<Integer>(Arrays.asList(6, 5))); 
    } 

    public void createPieces() { 
     int y = 1; 

     if (playernumber == 2) { 
      y = 7; 
     } 

     List<Integer> openValues = new ArrayList<>(); 

     openValues.add(1); 
     openValues.add(2); 
     openValues.add(11); 
     openValues.add(12); 
     for (int x = 0; x < 2; x++) { 
      openValues.add(3); 
     } 
     for (int x = 0; x < 3; x++) { 
      openValues.add(4); 
     } 
     for (int x = 0; x < 4; x++) { 
      openValues.add(5); 
      openValues.add(6); 
      openValues.add(7); 
     } 
     for (int x = 0; x < 5; x++) { 
      openValues.add(8); 
     } 
     for (int x = 0; x < 8; x++) { 
      openValues.add(9); 
     } 
     for (int x = 0; x < 6; x++) { 
      openValues.add(10); 
     } 

     Collections.sort(openValues); 

     System.out.println(openValues.size()); 
     System.out.println(pieces.size()); 

     for (int x = 1; x <= 10; x++) { 
      for (int z = y; z <= y + 3; z++) { 

       // 1x1 Marshal 
       // 2x1 General 
       // 3x2 Colonel 
       // 4x3 Major 
       // 5x4 Captain 
       // 6x4 Lieutenant 
       // 7x4 Sergeant 
       // 8x5 Miner 
       // 9x8 Scout 
       // 10x6 Bomb 
       // 11x1 Flag 
       // 12x1 Spy 

       Piece piece = new Piece(new Coords(x, z), openValues.get(0), playerColor); 

       openValues.remove(0); 
       pieces.add(piece); 
      } 
     } 
    } 

    public InputFrame(LogicInterpreter holder, int playerNumber, String playerColor, int height, int width) { 
     this.height = height; 
     this.width = width; 
     playernumber = playerNumber; 
     this.playerColor = playerColor; 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     addCoords(); 
     this.holder = holder; 
     createPieces(); 
     jp = new Panel2(height, width); 
     setResizable(false); 
     jp.setBackground(new Color(235, 202, 158)); 
     setTitle("Player " + playerNumber + " Arrangement GUI  ||  Click Submit When Ready"); 
     jp.setPreferredSize(new Dimension(600, 600)); 
     jp.setLayout(null); 
     jp.addMouseListener(new HandleMouse()); 
     if(playernumber == 1) 
      submit.setBounds(width/10 * 4, height/10 * 7, width/10 * 2, height/10 * 2); 
     else 
      submit.setBounds(width/10 * 4, height/10, width/10 * 2, height/10 * 2); 
     submit.setFont(new Font("Arial", Font.BOLD, width * 20/600)); 
     submit.setBackground(Color.LIGHT_GRAY); 
     submit.addActionListener(new CloseListener(this)); 
     jp.add(submit); 
     getContentPane().add(jp); 
     pack(); 
     setVisible(true); 
    } 

    class CloseListener implements ActionListener { 
     private InputFrame frame; 

     public CloseListener(InputFrame frame) { 
      this.frame = frame; 
     } 

     public void actionPerformed(ActionEvent event) { 
      // Do the stuff here before closing 
      hidePieces = true; 
      repaint(); 
      if (playernumber == 1) { 
       holder.setP1Pieces(pieces); 
       JOptionPane.showMessageDialog(null, "Press When Ready for Next Player"); 
       holder.setSetUp1(true); 
      } else { 
       holder.setP2Pieces(pieces); 
       JOptionPane.showMessageDialog(null, "Press When Player 1 is Ready"); 
       holder.setSetUp2(true); 
      } 
      frame.dispose(); 
     } 
    } 

    public class Panel2 extends JPanel { 

     private static final long serialVersionUID = 1L; 
     int height = 0; 
     int width = 0; 

     public Panel2(int height, int width) { 
      this.height = height; 
      this.width = width; 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      for (int x = 0; x < width; x += width/10) { 
       for (int y = 0; y < height; y += height/10) { 
        boolean fill = false; 
        for (Entry<Integer, ArrayList<Integer>> coords : lakeCoords.entrySet()) { 
         if ((coords.getKey() - 1 == x/60 && coords.getValue().get(0) - 1 == y/60) 
           || (coords.getKey() - 1 == x/60 && coords.getValue().get(1) - 1 == y/60)) { 
          fill = true; 
          break; 
         } 
        } 
        if (fill) { 
         g.setColor(Color.BLUE); 
         g.fillRect(x, y, width/10, height/10); 
         g.setColor(Color.BLACK); 
         g.drawRect(x, y, width/10, height/10); 
        } else { 
         g.setColor(Color.BLACK); 
         g.drawRect(x, y, width/10, height/10); 
        } 
       } 
      } 

      if(hidePieces){ 
       for (Piece piece : pieces) { 
        try { 
         g.drawImage(ImageIO.read(new File(playerColor + "_pieces/" + (playerColor.equals("blue") ? "Blue" : "Red") + "_Strat_Piece" 
           + ".png")), piece.getX() * width/10 - width/10, 
           piece.getY() * height/10 - height/10, width/10, height/10, null); 
        } catch(Exception e){} 
       } 
      } else { 
       for (Piece piece : pieces) { 
        g.drawImage(piece.getImage(), piece.getX() * width/10 - width/10, 
          piece.getY() * height/10 - height/10, width/10, height/10, null); 
       } 

       if (selectedPiece != null) { 
        g.setColor(Color.BLUE); 
        g.drawImage(selectedPiece.getImage(), selectedPiece.getX() * width/10 - width/10, 
          selectedPiece.getY() * height/10 - height/10, width/10, height/10, null); 
        g.drawRect(selectedPiece.getX() * width/10 - width/10, 
          selectedPiece.getY() * height/10 - height/10, width/10, height/10); 
       } 
      } 
     } 
    } 

    private class HandleMouse extends MouseAdapter { 
     public void mousePressed(MouseEvent e) { 
      int x = e.getX(); 
      int y = e.getY(); 
      Coords coordinates = holder.getClickedBox(x, y, width, height); 
      boolean found = false; 
      boolean move = false; 

      for (Piece piece : pieces) { 
       if (piece.getX() == coordinates.getX() && piece.getY() == coordinates.getY()) { 
        found = true; 
        if (selectedPiece == null) { 
         selectedPiece = piece; 
        } else { 
         move = true; 
         secondSelectedPiece = piece; 
        } 
       } 
      } 
      if (move) { 
       pieces.remove(selectedPiece); 
       pieces.remove(secondSelectedPiece); 
       Coords storage = selectedPiece.getCoords(); 
       selectedPiece.setCoords(secondSelectedPiece.getCoords()); 
       secondSelectedPiece.setCoords(storage); 
       pieces.add(selectedPiece); 
       pieces.add(secondSelectedPiece); 
       selectedPiece = null; 
       secondSelectedPiece = null; 
      } else if (!found) { 
       if (selectedPiece != null) { 
        selectedPiece = null; 
       } 
      } 
      repaint(); 
     } 
    } 
} 
+0

想知道发生了什么真的很难,特别是因为你说它随机成为一个问题。你在调试方面尝试过什么?你有没有尝试删除/设置任何东西,看看问题是否仍然存在? – KyleKW

+1

*“有时在底部和右侧设置了额外宽度”*偶尔出现的问题通常与不启动EDT上的GUI有关。为了尽快提供更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –

回答

1

您是否检查过“有时”添加了多少像素?

当我在我的jframe上调用setResizable(true)时,我注意到“有时”有10个像素,宽度和高度都比我预期的要高。

如果这是你的情况,我回答了类似的问题here。 我能够使用'技巧'解决问题,多次调用包。

在答案中,我还链接了另一个类似的问题(this one),在那里我找不到另一个解决方案,但有些用户描述了这个错误。

+0

你明白了!非常感谢!不会很快找出那一个...... – NuffsaidM8