我对swing / awt没有多少体验。
我的问题是:
我需要画一些像棋盘(NxN)的东西。
一般来说,我需要访问每个单元格来进行更改(当程序运行时,例如我单击按钮,并且该板上的单元格会发生某些事情)。
如果Component
允许我在单元格Image
中设置,那将会很有用。
我尝试使用GridLayout
,但我什么都没有让我满意。
你知道如何简单地解决这个问题吗?
答案 0 :(得分:3)
我自己用Java做了一个国际象棋游戏,找到了我用过的代码。
所以这是让你开始的事情:
ChessBoardTest:
public class ChessBoardTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
Image blackBlock=ImageIO.read(new File("c:/bblock.jpg"));
Image whiteBlock=ImageIO.read(new File("c:/wblock.jpg"));
Board board = new Board(whiteBlock,blackBlock);
//add pieces to board
board.addPiece(new ImageIcon("c:/castle.jpg"), "A1");//just one example
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Board.java:
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/*
* @author David Kroukamp
*/
public class Board extends JFrame {
//intialize variables
private Image boardImage1;
private Image boardImage2;
//intialize components
private JPanel centerPanel = new JPanel();
private JPanel southPanel = new JPanel();
private JPanel westPanel = new JPanel();
//initialze arrays to hold panels and images of the board
private JLabel[] labels = new JLabel[64];
private ImagePanel[] panels = new ImagePanel[64];
public Board(Image boardImage1, Image boardImage2) {
this.boardImage1 = boardImage1;
this.boardImage2 = boardImage2;
createAndShowGUI();//call method to create gui
}
private void createAndShowGUI() {
setTitle("Chess board example");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
addComponentsToPane(getContentPane());
setSize(800, 600);
setLocationRelativeTo(null);
setVisible(true);
}
/**
* Adds all the necessary components to the content pane of the JFrame, and
* adds appropriate listeners to components.
*/
private void addComponentsToPane(Container contentPane) {
GridLayout gridLayout = new GridLayout(8, 8);
centerPanel.setLayout(gridLayout);
//call mehod to add labels to south panel
addLabelsToSouthPanel();
//call method to add oanels to west panel
addLabelsToWestPanel();
//call method to add panels and labels to the center panel which holds the board
addPanelsAndLabels();
//add all panels to frame
contentPane.add(centerPanel, BorderLayout.CENTER);
contentPane.add(southPanel, BorderLayout.SOUTH);
contentPane.add(westPanel, BorderLayout.WEST);
}
private void addLabelsToSouthPanel() {
GridLayout gridLayout = new GridLayout(0, 8);
southPanel.setLayout(gridLayout);
JLabel[] lbls = new JLabel[8];
String[] label = {"A", "B", "C", "D", "E", "F", "G", "H"};
for (int i = 0; i < 8; i++) {
lbls[i] = new JLabel(label[i] + "");
southPanel.add(lbls[i]);
}
}
private void addLabelsToWestPanel() {
GridLayout gridLayout = new GridLayout(8, 0);
westPanel.setLayout(gridLayout);
JLabel[] lbls = new JLabel[8];
int[] num = {8, 7, 6, 5, 4, 3, 2, 1};
for (int i = 0; i < 8; i++) {
lbls[i] = new JLabel(num[i] + "");
westPanel.add(lbls[i]);
}
}
private void addPanelsAndLabels() {
//call methd to create panels with backgound images and appropriate names
addPanelsAndImages();
for (int i = 0; i < panels.length; i++) {
labels[i] = new JLabel();
//used to know the postion of the label on the board
labels[i].setName(panels[i].getName());
panels[i].add(labels[i]);
//adds panels created in addPanelsAndImages()
centerPanel.add(panels[i]);
}
}
//this method will create panels with backround images of chess board and set its name according to 1-8 for rows and A-H for coloumns
private void addPanelsAndImages() {
int count = 0;
String[] label = {"A", "B", "C", "D", "E", "F", "G", "H"};
int[] num = {8, 7, 6, 5, 4, 3, 2, 1};
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
if ((col + row) % 2 == 0) {//even numbers get white pieces
panels[count] = new ImagePanel(boardImage1);
} else {//odd numbers get black pieces
panels[count] = new ImagePanel(boardImage2);
}
panels[count].setName(label[col] + num[row]);
count++;
}
}
}
//method sets image of a label at a certain position in the board according to the block name i.e D4
public void addPiece(ImageIcon img, String block) {
for (int s = 0; s < labels.length; s++) {
if (labels[s].getName().equalsIgnoreCase(block)) {
labels[s].setIcon(img);
}
}
}
//nested class used to set the background of frame contenPane
class ImagePanel extends JPanel {
private Image image;
/**
* Default constructor used to set the image for the background for the
* instance
*/
public ImagePanel(Image img) {
image = img;
}
@Override
protected void paintComponent(Graphics g) {
//draws image to background to scale of frame
g.drawImage(image, 0, 0, null);
}
}
}
HTH让你入门。
答案 1 :(得分:1)
Roseindia实际上有reasonable example在线。