我试图让一些jLabel在按下GridLayout键的JPanel上彼此交换位置。
到目前为止:
1。我只能让他们对鼠标点击做出反应
2。他们只能在其上方和左侧的位置进行切换。
注:
1。如果我设置movePlayer(1),它会工作。并从网格(8,7)切换一个带有玩家图像的JLabel,其中一个JLabel上面有一个地板图像。然而,我的问题是,当我设置movePlayer(2)时,它会给我和索引bouds异常
2。这只是我认为与该问题有关的守则的一部分:
JPanel myCentrePanel = new JPanel();
MapElement[][] myMap = new MapElement[8][7];
public TileSwitching(){
super("TileSwitching");
setSize(400,400);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
myCentrePanel.setLayout(new GridLayout(8,7));
myCentrePanel.setPreferredSize(new Dimension(5,5));
add(myCentrePanel);
loadMap(level1);
drawMap();
myCentrePanel.setFocusable(true);
myCentrePanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
movePlayer(1);
myCentrePanel.removeAll();
drawMap();
myCentrePanel.revalidate();
}
});
myCentrePanel.setBackground(Color.CYAN);
}
public void movePlayer(int dir){
if(dir == 1){
for(int i = 0; i<8; i++){
for(int j= 0; j<7; j++){
if (myMap[i][j].getClass() == wk.getClass()){
myMap[i-1][j] = new Player();
myMap[i][j] = new Floor();
}
else{
myMap[i][j] = myMap[i][j];
}
}}
if(dir == 2){
for(int i = 0; i<8; i++){
for(int j= 0; j<7; j++){
if (myMap[i][j].getClass() == wk.getClass()){
myMap[i+1][j] = new Player();
myMap[i][j] = new Floor();
}
else{
myMap[i][j] = myMap[i][j];
}
}}
}
public static void main(String[] args) {
TileSwitching tl = new TileSwitching();
TileSwitching.setVisible(true);
}
上面的代码中没有显示的内容:
1.MapElement
是许多子类的父类(继承)。
2.loadMap()
从字符数组中读出字符(例如a,b,c...),以子类的新实例填充数组myMapMapElement(例如new Player(),new Floor(),new Tree()
)。
3.根据myMap[i][j]的类,将JLabels添加到JPanel中。
4.(这两种方法都是用双For循环i完成的
谢谢你,抱歉不好的编码和傲慢,希望这是清楚的。请随意建议一个更好的方法来移动一个玩家(JLabel)
在一个JPanel
与一个GridLayout
。记住,主要问题是:为什么(dir==1)
工作,而(dir==2)
不工作?!
我不确定我是否完全理解你的问题,但是,有一些技巧可以用来改变组件的呈现顺序,例如,你可以改变组件ZOrder
,这将改变组件的排列顺序和渲染。
如果您想包含键盘交互,我强烈建议您使用键绑定API,例如。。。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel player;
private List<JLabel> tiles;
public TestPane() {
setLayout(new GridLayout(3, 3));
player = makeLabel("P");
add(player);
tiles = new ArrayList<>(8);
for (int index = 0; index < 8; index++) {
JLabel tile = makeLabel(" ");
tiles.add(tile);
add(tile);
}
addKeyBinding("left", KeyEvent.VK_LEFT, new MoveAction(-1, 0));
addKeyBinding("right", KeyEvent.VK_RIGHT, new MoveAction(1, 0));
addKeyBinding("up", KeyEvent.VK_UP, new MoveAction(0, -1));
addKeyBinding("down", KeyEvent.VK_DOWN, new MoveAction(0, 1));
}
protected void addKeyBinding(String name, int keyCode, Action action) {
InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = getActionMap();
inputMap.put(KeyStroke.getKeyStroke(keyCode, 0), name);
actionMap.put(name, action);
}
protected JLabel makeLabel(String text) {
JLabel label = new JLabel(text);
label.setBorder(new CompoundBorder(
new LineBorder(Color.GRAY),
new EmptyBorder(4, 4, 4, 4)));
return label;
}
public class MoveAction extends AbstractAction {
private final int xDelta, yDelta;
public MoveAction(int xDelta, int yDelta) {
this.xDelta = xDelta;
this.yDelta = yDelta;
}
@Override
public void actionPerformed(ActionEvent e) {
int index = getComponentZOrder(player);
index += xDelta;
index += (yDelta * 3);
if (index < 0) {
index = 0;
} else if (index >= getComponentCount()) {
index = getComponentCount() - 1;
}
setComponentZOrder(player, index);
revalidate();
repaint();
}
}
}
}
现在,
您可能还希望了解如何使用操作
我有一个名为“DisplayPanel”的类(它扩展了JPanel),我在那里画了一个正方形,它来自一个名为“square”的类(它扩展了JComponent)。如何使用键在JPanel中移动矩形? 正方形类有通常的绘制方法: “squarishThing”是一个普通矩形: 问题是:与“游戏库”不同,尝试“手动”做这样的事情是相当令人困惑的。我不知道“while循环”去哪里了。我试图在显示面板中放
我有几个项目保存到documents目录。我目前需要这些以编程方式移动到另一个目录。我成功地创建了新目录,但在使用FileManager.Default.MoveItem时似乎并没有看到这一点。 用于创建目录的代码。 我用这个代码检查我的URL。 它输出这个。 无法将文件移动到新媒体路径错误-错误域=nscocoaErrorDomain代码=516“无法将Image_5移动到”Documents“
问题内容: 因此,这是html代码: And here is css: 因此,我使用margin-top:-10px,但它移动了整个容器,而不仅仅是图像。 问题答案: 这是由于保证金合拢规则。要解决此问题,您可以简单地在元素上使用透明边框: 现在,为什么添加边框会中止边距折叠规则? 这不是防止保证金崩溃的唯一方法。还有其他方法,例如向元素添加填充。 为什么这可以防止利润减少?因为它(元素)与盒子布
问题内容: 我是Java的新手,主要是CardLayout。我只想切换由JPanels表示的“窗口”。我在CardLayout的某处读过这份工作。但我的问题是,当到(这是CardLayout之一),它改变的内容几个像素顶端,从它的中心位置了。我在代码中跳过了它应该在的位置。 我有以下代码: 拜托,我搞砸了吗?谢谢。 问题答案: 由于您要在主JPanel中添加两个JPanel,因此这两个面板都需要容
我有一个,名为,布局设置为。在面板内部有三个,分别添加到、和。现在,我的要求是,如果单击Settings按钮,它将在上方显示一个透明的。这个透明的面板将包含一个不透明的,更小的,居中的面板,其中将包含设置的东西。 我知道我可以使用来实现这一点,但是查看教程,它说您只能使用绝对定位来放置不同深度的组件,我知道这是非常不鼓励的。 是否有其他方法可以做到这一点,而不使用绝对定位?
编辑:我可以从flyway命令行工具运行相同的配置,但不能从ant任务运行。 我有一个flyway配置,可以在我的oracle数据库上运行。我正在SQL Server数据库上设置flyway。当我尝试任何蚂蚁任务时,Flyway会挂起。包括用于测试与数据库连接的信息。 当我运行Flyway时,它似乎挂起来了。当执行任何ant任务时,详细日志将以“[flyway:info]DDL Transacti