Java GUI:JLabel可以保存一个对象/类吗?

时间:2013-12-28 19:23:27

标签: java swing user-interface jlabel chess

我正处于java国际象棋游戏构建的中间,我正在尝试构建它的GUI部分。 GUI板已完成,我可以在板上设置件。我不想简单地将图像设置为片段,而是希望能够设置一个新的实例化的Rook类,它接收颜色和图像。我需要JLabel片段来执行此操作以便稍后在代码中,我可以添加使得车辆遵守轮流和移动规则的方法。

据我所知,JLabel只能保存图像或文字,因此我不相信这可能是不可能的。任何帮助,将不胜感激。我的具体问题是:

  • 是否可以让JLabel成为带有颜色和图像的Rook对象?如果是这样,怎么样?
  • 如果不可能的话,在棋盘上设置一块可以清楚地显示棋子(作为车,棋子......)并设置其图像和颜色的替代方法是什么?

    任何帮助都会受到高度赞赏。

代码:

    // 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);

2 个答案:

答案 0 :(得分:2)

我最近正在开发一个国际象棋应用程序。我使用的是64个方格中每一个的子类JLabel

以下是相关代码和示例截图

enter image description here

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。