我正处于java国际象棋游戏构建的中间,我正在尝试构建它的GUI部分。 GUI板已完成,我可以在板上设置件。我不想简单地将图像设置为片段,而是希望能够设置一个新的实例化的Rook类,它接收颜色和图像。我需要JLabel片段来执行此操作以便稍后在代码中,我可以添加使得车辆遵守轮流和移动规则的方法。
据我所知,JLabel只能保存图像或文字,因此我不相信这可能是不可能的。任何帮助,将不胜感激。我的具体问题是:
如果不可能的话,在棋盘上设置一块可以清楚地显示棋子(作为车,棋子......)并设置其图像和颜色的替代方法是什么?
任何帮助都会受到高度赞赏。
代码:
// Sets a piece on the board
JLabel piece = new JLabel("whiteRook.png"); //want this to be a new instantiation of a Rook
JPanel panel = (JPanel) chessBoard.getComponent(0);
panel.add(piece);
// Failed Attempt ---------------------------------------------------//
// String color = "white";
// ImageIcon WhiteRook = new ImageIcon("whiteRook.png");
// Rook firstRook = new Rook(color, WhiteRook);
//
// piece = new JLabel(firstRook);
// panel = (JPanel) chessBoard.getComponent(0);
// panel.add(piece);
答案 0 :(得分:2)
我最近正在开发一个国际象棋应用程序。我使用的是64个方格中每一个的子类JLabel
。
以下是相关代码和示例截图
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
public class Cell extends JLabel
{
Color backgroundColor;
boolean highlight=false;
Color highlightColor=new Color(132, 146, 255);
Border blackBorder=BorderFactory.createLineBorder(Color.BLACK);
public void setBackgroundImage(ImageIcon backgroundImage)
{
setIcon(backgroundImage);
}
public Cell(Color backGroundColor, ImageIcon backgroundImage)
{
super(backgroundImage);
this.backgroundColor=backGroundColor;
setBorder(blackBorder);
}
@Override
protected void paintComponent(Graphics g)
{
if(!highlight) g.setColor(backgroundColor);
else g.setColor(highlightColor);
g.fillRect(0,0,getWidth(),getHeight());
super.paintComponent(g);
}
public void setHighlightMode(boolean status)
{
if(status==highlight) return;
highlight=status;
repaint();
}
}
答案 1 :(得分:1)
你可以这样做。为每件作品定制JPanel
。让cunstructor接受ChessPiece
对象。绘制图像并使用颜色执行某些操作
public class PiecePanel extends JPanel{
private static final D_W = 50;
private static final D_H = 50;
BufferedImage img;
Color color;
public PiecePanel(ChessPiece piece) {
color = piece.getColor();
try {
img = ImageIO.read(piece.getImagePath());
} catch (IOException ex){
ex.printStackTrace();
}
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(color);
// do something with color
g.drawImage(0,0,getWidth(), getHeight(), 0, 0, img.getWidth(), img.getHeight());
}
public Dimension getPreferredSize(){
return new Dimension(D_W, D_H);
}
}
然后您可以像这样实例化每个ChessPiece
面板
ChessPiece bRook1 = new Rook(path, color);
JPanel blackRook1 = new PiecePanel(bRook1);
您可以对JLabel进行相同的子类化。但它是JLabel上新绘制的新产品。如果你不想做任何额外的绘画,只需要Sublclass JLabel。