- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 java 创建了一个西洋跳棋游戏界面,并将棋子放置在游戏板上的每个位置,但目前我无法将棋子从一个方格移动到另一个方格。
棋盘游戏中如何移动跳棋棋子?以下是我尝试过的源代码:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package chackergame;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
/**
*
* @author wenda
*/
public class CheckerGame extends JFrame {
private final int ROWS = 8;
private final int COLL = 8;
private final JPanel[][] square = new JPanel[8][8];
private JPanel backgroundPanel;
private final JLabel statusBar = new JLabel(" Red turn to play");
private JLabel lbPieces = new JLabel();
private boolean inDrag = false;
public CheckerGame() {
//Add a chess board to the Layered Pane
backgroundPanel = new JPanel();
backgroundPanel.setLayout(new GridLayout(8, 8, 0, 0));
add(backgroundPanel, BorderLayout.CENTER);
add(statusBar, BorderLayout.SOUTH);
createSquare();
addPieces();
setIconImage(PiecesIcon.iconGame.getImage());
setTitle("Java Checkers");// set title game
setSize(500, 500);
//setResizable(false);
setLocationRelativeTo(null);
setLocationByPlatform(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void createSquare() {
for (int row = 0; row < ROWS; row++) {
for (int col = 0; col < COLL; col++) {
JPanel cell = new JPanel();
if ((row + col) % 2 == 1) {
cell.setBackground(new Color(99, 164, 54));
// cell.setBackground(Color.BLACK);
}
if ((row + col) % 2 == 0) {
cell.setBackground(new Color(247, 235, 164));
// cell.setBackground(Color.WHITE);
}
square[row][col] = cell;
backgroundPanel.add(square[row][col]);
}
}
}
/**
* Add pieces to the board
*/
private void addPieces() {
for (int row = 0; row < ROWS; row++) {
for (int col = 0; col < COLL; col++) {
lbPieces = new JLabel();
lbPieces.setHorizontalAlignment(SwingConstants.CENTER);
//lb.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
if ((row + col) % 2 == 1) {
if (row < 3) {
lbPieces.setIcon(PiecesIcon.redPiece);
} else if (row > 4) {
lbPieces.setIcon(PiecesIcon.whitePiece);
}
}
square[row][col].setLayout(new BorderLayout());
square[row][col].add(lbPieces, BorderLayout.CENTER);
} // end of for col loop
} // end of for row loop
} // end of addPieces method
public class MouseInput extends MouseAdapter {
@Override
public void mousePressed(MouseEvent evt) {
}
@Override
public void mouseReleased(MouseEvent evt) {
}
@Override
public void mouseClicked(MouseEvent evt) {
}
@Override
public void mouseDragged(MouseEvent evt) {
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new CheckerGame();
}
}
最佳答案
基本问题是将组件(在本例中为 JLable
)从任何源容器(JPanel
)拖动到任何其他容器。
每个这样的容器都可以是拖动组件的源或其放置目标。所以它需要同时支持两者。此类 JPanel
在以下 DragDropPane
类中实现。
为了编写这段代码,我借用了 MadProgrammer's answer它显示了一个源和一个目标的解决方案。
这是一个单文件 mre :可以将整个代码复制粘贴到LabelDnD.java
文件中,然后运行。它演示了将 JLabel
从一个面板拖动到另一个面板。请注意评论:
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class LabelDnD{
private static final int ROWS = 5, COLS = 5, GAP = 4;
private Component makeContent() {
JPanel content = new JPanel(new GridLayout(ROWS,COLS, GAP,GAP));
content.setBorder(BorderFactory.createLineBorder(content.getBackground(), GAP));
for(int i = 0; i < ROWS*COLS ; i++){
content.add(new DragDropPane(String.valueOf(i)));
}
return content;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("Label Drag & Drop");
f.add(new LabelDnD().makeContent());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.pack();
f.setVisible(true);
});
}
}
class DragDropPane extends JPanel implements DragGestureListener, DragSourceListener {
private static final int W = 50, H = 50;
private JComponent dragable;
public DragDropPane(String text) {
setBackground(Color.white);
setPreferredSize(new Dimension(W, H));
setBorder(BorderFactory.createLineBorder(Color.blue, 1));
var label = new JLabel(text, JLabel.CENTER);
setContent(label);
new MyDropTargetListener(this);
DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
this, DnDConstants.ACTION_COPY, this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}
public void setContent(JComponent component) {
removeAll();
dragable = component;
add(component);
repaint();
}
//-->DragGestureListener implementation
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
// Create our transferable wrapper
Transferable transferable = new TransferableComponent(dragable);
// Start the "drag" process...
DragSource ds = dge.getDragSource();
ds.startDrag(dge, Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR), transferable, this);
remove(dragable);
revalidate(); repaint();
}
//-->DragSourceListener implementation
@Override
public void dragEnter(DragSourceDragEvent dsde) {}
@Override
public void dragOver(DragSourceDragEvent dsde) {}
@Override
public void dropActionChanged(DragSourceDragEvent dsde) {}
@Override
public void dragExit(DragSourceEvent dse) {}
@Override
public void dragDropEnd(DragSourceDropEvent dsde) {
// If the drop was not successful, we need to
// return the component back to it's previous
// parent
if (!dsde.getDropSuccess()) {
setContent(dragable);
}
}
}
class MyDropTargetListener extends DropTargetAdapter {
private final DragDropPane target;
public MyDropTargetListener(DragDropPane target) {
this.target = target;
new DropTarget(target, DnDConstants.ACTION_COPY, this, true, null);
}
@Override
public void drop(DropTargetDropEvent event) {
try {
var tr = event.getTransferable();
var component = (JComponent) tr.getTransferData(TransferableComponent.component);
if (event.isDataFlavorSupported(TransferableComponent.component)) {
event.acceptDrop(DnDConstants.ACTION_COPY);
target.setContent(component);
event.dropComplete(true);
} else {
event.rejectDrop();
}
} catch (Exception e) {
e.printStackTrace();
event.rejectDrop();
}
}
}
class TransferableComponent implements Transferable {
protected static final DataFlavor component =
new DataFlavor(JComponent.class, "A Component");
protected static final DataFlavor[] supportedFlavors = {
component
};
private final JComponent componentToTransfer;
public TransferableComponent(JComponent componentToTransfer) {
this.componentToTransfer = componentToTransfer;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return supportedFlavors;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(component);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (flavor.equals(component)) return componentToTransfer;
else throw new UnsupportedFlavorException(flavor);
}
}
<小时/>
关于java - 棋盘游戏中如何移动跳棋棋子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57684613/
我有一个棋盘格,并将其连接到 JPanel: import javax.swing.*; import java.awt.Graphics; import java.awt.Color; public
我看不出有什么问题,我正在尝试将 gameBoard 数组(这不是数组吗?- 请参阅构造函数)传递到 findPiece 方法中,但它说了不是一个数组,我应该在这里传递什么来获得未更新的板?抱歉,我是
所以我想检查输入的位置在棋盘中是否有效, //returns true if the position is in the range of A1-H8 private boolean isValid
将单一职责原则应用于棋盘应用程序,Piece 接口(interface)/类应该负责什么? 我确信它需要知道它的颜色、类型和有效 Action 。但是它是否也应该知道它在棋盘中的位置(x/y)?或者,
我需要使用 J 打印棋盘,给定奇数的函数需要创建一个 NxN 矩阵并在每个其他框中放置一个“X”。我已经制作了矩阵,但我无法弄清楚其他盒子部分。 到目前为止我所拥有的 N =: 3 checker =
我目前有一个一维棋盘坐标数组(例如 ["B1","D1","F1","H1","E8"] 用于棋盘游戏。我已将数组“位置”初始化为是上面的值,但这可以是游戏任何时候的任何值。该数组的长度根据用户给定的
我想使用canvas和通过覆盖方法onDraw在android studio中动态绘制一个8×8的棋盘,我几乎已经成功了,但我遇到了一个非常烦人的问题。 我已经制作了一个自定义 View ,我的目标是
所以我开始了一个 TicTacToe 项目,而且我是一个初学者,所以我不知道如何做很多事情。这是半个小时编码的结果。 我似乎在调试 Player2 不轮流的原因时遇到问题。 所以它要求添加更多细节,然
我正在制作棋盘游戏,但无法 move 它们。棋子会根据骰子的结果 move 。下面是我尝试做的,但它不起作用。(来自 button[].addActionListener(new ActionList
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
谁能告诉我如何使用 JavaScript、表格标签或 生成棋盘 (8x8)? 到目前为止,我得到了以下内容: div { border:1px solid black; width:20px;
大家好,我最近开始做一个国际象棋应用程序,除了 GUI 之外,我已经设置好了所有的东西。出于某种原因,我无法让电路板显示瓷砖,我也不知道为什么。 (推测)我认为我的问题与我对 DOM 的使用有关。对我
我试图创建一个带有表格的棋盘 (HTML/CSS)。我在表格边框方面遇到了麻烦。我只希望电路板有边框,排除行号和列字母。 我该怎么做? table { border-bottom: solid 2
我是 java 和 android 的新手,但我正在寻找一个可以走上正轨的好教程。我想编写一个函数,用于在我的应用程序当前 View 的背景中绘制/重绘白底黑棋盘图案。我不想使用实际图像,因为我希望能
我正在尝试使用 GUI 的 NetBeans IDE 在 Java 中制作国际象棋游戏,但我无法使棋子停留在棋盘上方,当我尝试时,棋盘就会被推开。我对这两个图像都使用了标签。如何让棋子停留在棋盘上方而
我试图为 Tic Tac Toe 游戏编写代码。我编写了以下代码来显示游戏板,但出现了问题,并且没有显示所需的输出。你能帮我找出错误在哪里吗? 这里: 0代表空白, 1代表X和 2代表O。 publi
我的任务是通过 paintComponent 方法创建一个 10x10 可调整大小的棋盘。 我的问题是第一行正确,但下一行不显示,我根本不知道我的错误在哪里 GrafikPanel 类: import
我在这里尝试使用 javascript 棋盘:http://chessboardjs.com/ .不幸的是,我不知道 javascript 或 CSS,并且对 HTML 很生疏,所以我不理解文档,即使
我正在尝试在棋盘(见附图)和基于 cordova 的 Android 国际象棋游戏(lichess)之间传输数据。两个设备都将通过 USB 数据线连接。 android 的 cordova 应用程序是
我使用以下 CSS 代码创建了一个棋盘图案: .testcheckerboard{ width: 200px; height: 100px; background-color: white
我是一名优秀的程序员,十分优秀!