- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试为名为 Carcassone 的游戏创建应用程序,但在将 JLayeredPane 与 MouseAdapters 结合使用时遇到问题。
目前我有一个 JLayeredPane,其中包含一个带有 GridLayout 的 JPanel,用作游戏板。 GridLayout 的每个单元格都包含一个 JPanel,其中包含一个 JLabel 来表示板上的图 block 。 (空图 block 只是一个带有黑色方 block 作为图像的 JLabel)。
我在 JLayeredPane 中添加了一个自定义鼠标适配器 (TileMouseAdapter),它允许用户在游戏板周围移动图 block (鼠标按下 - 拖动 - 释放)或旋转图 block (鼠标单击)。(要测试,请单击下一个图 block 按钮并在出现的图 block 周围移动,单击提交按钮后,如果移动有效,则图 block 将不再可拖动)。这一切都完美地工作,直到我添加下一部分。
现在我想向屏幕顶部的 JLayeredPane 添加一个单独的 JPanel。该部分应放置玩家可以放置在图 block 上的游戏棋子。我还希望 JPanel 能够容纳游戏棋子,以便玩家可以将棋子拖到图 block 上。但是,当我创建此面板并将其添加到 JLayeredPane 时,上一节中的鼠标适配器不再正常工作。例如,如果您单击图 block 的底部部分,它不再识别您正在单击该图 block 。仅当您单击每个图 block 的上半部分时,它才会选择该图 block 。此外,如果您单击某个图 block 的底部,有时它会选择下面的图 block 。也就是说,选择图 block 的机制似乎向上移动了大约半个图 block 。任何人都可以找出这个问题的解释/可能的解决方案吗?谢谢!
下面的代码是我用来创建 JLayeredPane 的代码,其中包含棋盘的 JPanel (myBoardPanel) 以及游戏件的面板 (makeMeeplePanel())
private JLayeredPane makeBoardPanel() {
JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setLayout(new BorderLayout());
myBoardPanel = new CarcassoneBoardPanel(layeredPane);
layeredPane.add(makeMeeplePanel(), BorderLayout.NORTH, JLayeredPane.DEFAULT_LAYER);
layeredPane.add(myBoardPanel, BorderLayout.CENTER, JLayeredPane.DEFAULT_LAYER);
TileMouseAdapter tileMouseAdapter = new TileMouseAdapter(layeredPane);
//MeepleMouseAdapter meepleMouseAdapter = new MeepleMouseAdapter(layeredPane);
layeredPane.addMouseListener(tileMouseAdapter);
layeredPane.addMouseMotionListener(tileMouseAdapter);
//layeredPane.addMouseListener(meepleMouseAdapter);
//layeredPane.addMouseMotionListener(meepleMouseAdapter);
return layeredPane;
}
这是我为游戏板定制的鼠标适配器:
package gui;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import tiles.*;
public class TileMouseAdapter extends MouseAdapter {
private JLayeredPane myLayeredPane;
private CarcassoneBoardPanel myBoard;
private Tile dragLabel;
private JPanel clickedPanel;
public TileMouseAdapter(JLayeredPane layeredPane) {
myLayeredPane = layeredPane;
myBoard = (CarcassoneBoardPanel) layeredPane.getComponents()[1];
}
private void reset() {
if (dragLabel != null) {
myLayeredPane.remove(dragLabel);
myLayeredPane.revalidate();
myLayeredPane.repaint();
}
dragLabel = null;
clickedPanel = null;
}
@Override
public void mouseClicked(MouseEvent event) {
clickedPanel = (JPanel) myBoard.getComponentAt(event.getPoint());
if (clickedPanel == null) {
reset();
return;
}
Component[] components = clickedPanel.getComponents();
if (!(components[0] instanceof Tile) || components[0] instanceof EmptyTile || !((Tile) components[0]).isDraggable()) {
return;
}
dragLabel = (Tile) components[0];
dragLabel.rotate();
clickedPanel.revalidate();
clickedPanel.repaint();
reset();
}
@Override
public void mousePressed(MouseEvent event) {
clickedPanel = (JPanel) myBoard.getComponentAt(event.getPoint());
System.out.println(event.getPoint());
if (clickedPanel == null) {
reset();
return;
}
Component[] components = clickedPanel.getComponents();
if (!(components[0] instanceof Tile) || (components[0] instanceof EmptyTile) || !((Tile) components[0]).isDraggable()) {
return;
}
dragLabel = (Tile) components[0];
clickedPanel.remove(dragLabel);
clickedPanel.add(new EmptyTile(dragLabel.getRow(), dragLabel.getCol()));
clickedPanel.revalidate();
clickedPanel.repaint();
int x = event.getPoint().x - dragLabel.getWidth() / 2;
int y = event.getPoint().y - dragLabel.getHeight() / 2;
dragLabel.setLocation(x, y);
try {
myLayeredPane.add(dragLabel, JLayeredPane.DRAG_LAYER);
myLayeredPane.repaint();
} catch (IllegalArgumentException e) {
//TODO: deal with this?
//gives error for some unknown reason, but doesnt effect anything? ignore...dumb error cus jswing sucks
}
}
@Override
public void mouseDragged(MouseEvent event) {
if (dragLabel == null) {
return;
}
int x = event.getPoint().x - dragLabel.getWidth() / 2;
int y = event.getPoint().y - dragLabel.getHeight() / 2;
dragLabel.setLocation(x, y);
myLayeredPane.revalidate();
}
@Override
public void mouseReleased(MouseEvent event) {
//TODO: make sure cannot place tile on already occupied panel...
if (dragLabel == null || !dragLabel.isDraggable()) {
return;
}
myLayeredPane.remove(dragLabel);
myLayeredPane.revalidate();
myLayeredPane.repaint();
JPanel droppedPanel = (JPanel) myBoard.getComponentAt(event.getPoint());
if (droppedPanel == null) {
clickedPanel.removeAll();
clickedPanel.add(dragLabel);
clickedPanel.revalidate();
reset();
return;
}
dragLabel.setPosition(((Tile) droppedPanel.getComponents()[0]).getRow(), ((Tile) droppedPanel.getComponents()[0]).getCol());
droppedPanel.removeAll();
droppedPanel.add(dragLabel);
droppedPanel.revalidate();
reset();
}
}
如果您需要更多信息/代码,请告诉我。这是我第一次使用这个网站,如果我没有提供足够的解释等,我很抱歉......谢谢!
最佳答案
您的问题在这里:
@Override
public void mouseClicked(MouseEvent event) {
clickedPanel = (JPanel) myBoard.getComponentAt(event.getPoint());
event.getPoint()
将返回一个与注册鼠标监听器的 layeredPane
相关的 Point
。 myBoard.getComponentAt()
将返回相对于 myBoard
组件的位置的组件,该组件位于分层 Pane 中的 layeredPane.getComponents()[1]
.
关于java - JLayeredPane 和 MouseAdapter 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17655179/
我正在尝试创建一个带有 JLayeredPane 的应用程序,该应用程序会根据父 JFrame 的大小自动缩放(这是使用 BorderLayout 作为框架内容 Pane 上的布局管理器)。困难的部分
是否可以在JTable内添加JLayeredPane()? 我尝试过: JLayeredPane agentPicturePane = new JLayeredPane(); St
我一直在努力做一些我认为很简单的事情: 我想创建一个带有背景图像的表单(JTextField)。为了使表单不覆盖背景图像,我使用 JLayeredPane。我一直在尝试不同的东西,似乎没有任何效果:出
我正在使用 JLayeredPane 来定位我的 JPanel 3 维,这样当有人单击 jpanel 时我可以实现“缩放”效果,我需要动态更改图层索引,以便单击的组件始终是在上面”。 JPanel j
我有一个 JLayeredPane。我在上面放置了几个组件。这些组件是扩展 jPanel 的类。所有组件都放置在同一深度层中。每个组件可能有也可能没有完全/部分位于其上方/下方的其他组件。当我单击组件
我有以下问题:我有一个 JLayeredPane,我需要向其中添加一个圆和一些线条。线条的问题是,它们应该能够重绘/移动位置(线条象征一些移动 vector )当我只是将一些 GLine 添加到 Gr
我有一个有两层的 JLayeredPane。顶层是完全透明的,充当玻璃 Pane ,捕获鼠标事件,然后将它们分派(dispatch)到其下方的 Pane 。由于未知原因,底层未正确绘制。我是否必须向其
我正在尝试创建一个面板,该面板使用 JLayeredPane 使面板位于另一个更大的面板上方的中心。但我似乎无法显示较小的面板。关于我做错了什么有什么想法吗? import java.awt.Dime
我有一个多层 java 应用程序,其中包含一系列需要手形光标的 JLabel 按钮,例如: button.setCursor(Cursor.getPredefinedCursor(Cursor.HAN
我有一个从 JFrame 扩展的类。我里面有多个 JLayeredPanes。我想从一个 JLayeredPane 切换到另一个。为此,我所做的是; 删除当前的 JLayeredPane,如 remo
我在 NetBeans 中有一个项目,它使用分层 Pane 通过在必要时在它们之间切换来显示重叠的面板。启动时,程序会在其中一个面板上显示介绍动画(在单独的线程上运行),通过以下方式实现: publi
我在 JLayeredPane 上有一些按钮和面板。 当我点击一个按钮时,一个面板通过 setvisible(true) 显示。但是,如果面板后面有一个按钮,并且我将鼠标悬停在按钮上,按钮就会出现在面
我的 JLayeredPane 有问题,我可能正在做一些非常简单的事情,但我无法全神贯注。我遇到的问题是所有组件都合并在一起并且没有排序。你能纠正这个吗,因为我不知道。我尝试执行的顺序是这样的布局 输
我有一个图像,我想要的只是将此图像打包到 JLabel 中,并将其添加到我的 JLayeredPane 中,以便稍后对多个图像进行分层。它可以在没有 JLayeredPane 的情况下处理一张图像,但
我想在运行时动态添加/隐藏/删除 jlayeredpanes,并且在选择另一个 Pane 时还应该隐藏每个 Pane 上的内容。我已经尝试过以下代码,但我不知道如何执行此操作。以下代码在选择备用 Pa
我有一个代码,可以在鼠标单击时在 jLayeredpane 中的单击位置添加 jbutton。现在问题出在调整大小上。当我在运行时不更改 jLayeredpane 的大小时,就没有问题。当我最大化窗口
我在分层 Pane 中有一组面板。我需要一个分隔符来将 sideBar 与 topBar 和 tabbedPanel 分开。我留了一个 10 像素的缓冲区来放置它。不幸的是,可能由于它是 JLayer
我需要一个 UI,我想在其中描绘网络设备的图形表示。为此,我只是加载多个图像并将它们一一重叠以显示设备的当前状态。我必须支持此 View 的缩放。缩放代码如下所示。 public void zoom(
在这里尝试分层 Pane ,但遇到了问题。我有两个 JPanel。我将它们都添加到 JLayeredPane 中 - panel1 足够大,可以占据整个空间,而 panel2 较小,并且使用 Flow
我正在尝试使用 JLayeredPane 将一个 JPanel 覆盖在另一个 JPanel 之上。由于某种原因,添加的面板没有显示。 这是创建 JLayeredPane 并向其中添加元素的代码: im
我是一名优秀的程序员,十分优秀!