我在一个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();
}
}
}
想知道发生了什么真的很难,特别是因为你说它随机成为一个问题。你在调试方面尝试过什么?你有没有尝试删除/设置任何东西,看看问题是否仍然存在? – KyleKW
*“有时在底部和右侧设置了额外宽度”*偶尔出现的问题通常与不启动EDT上的GUI有关。为了尽快提供更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –