Java 将四个按钮放置在十字形图案中,但彼此靠近
我正在尝试一个在画布上移动球的练习..我已经得到了移动球的部分,但我无法将“上移”和“下移”按钮放置在相应的位置。如果您运行此代码,您将看到“上移”和“下移”按钮与其他按钮相差很远。因此,我想让它们更靠近其他按钮(我想调整它们的垂直位置,同时保持它们的水平位置),这是我的代码..请提前帮助并感谢Java 将四个按钮放置在十字形图案中,但彼此靠近,java,swing,Java,Swing,我正在尝试一个在画布上移动球的练习..我已经得到了移动球的部分,但我无法将“上移”和“下移”按钮放置在相应的位置。如果您运行此代码,您将看到“上移”和“下移”按钮与其他按钮相差很远。因此,我想让它们更靠近其他按钮(我想调整它们的垂直位置,同时保持它们的水平位置),这是我的代码..请提前帮助并感谢 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CGmoveABall extends J
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
public class CGmoveABall extends JFrame {
public static final int CANVAS_WIDTH = 400;
public static final int CANVAS_HEIGHT = 340;
public static final Color LINE_COLOR = Color.BLACK;
public static final Color CANVAS_BACKGROUND = Color.CYAN;
private int x =150, y = CANVAS_HEIGHT/4; // top-left (x, y)
private int size = 100;
private DrawCanvas canvas;
public CGmoveABall() {
FlowLayout f1 = new FlowLayout(FlowLayout.CENTER,1,1);
JPanel btnPanel = new JPanel(f1);
JPanel CentrePanel = new JPanel(new FlowLayout());
JPanel DownPanel = new JPanel(new FlowLayout());
FlowLayout f2 = new FlowLayout(FlowLayout.LEFT,3,3);
JButton btnUp = new JButton("Move Up");
btnUp.setSize(10,3);
btnPanel.add(btnUp);
btnUp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
y -= 10;
System.out.println("ciao1");
canvas.repaint();
requestFocus();
}
});
JButton btnLeft = new JButton("Move Left ");
CentrePanel.add(btnLeft);
btnLeft.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
x -= 10;
// y -= 10;
canvas.repaint();
requestFocus(); }
});
JButton btnRight = new JButton("Move Right");
CentrePanel.add(btnRight,f1);
btnRight.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
x += 10;
// y += 10;
canvas.repaint();
requestFocus(); }
});
JButton btnDn = new JButton("Move Down");
DownPanel.add(btnDn);
btnDn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("ciao2");
y += 10;
canvas.repaint();
requestFocus();
}
});
canvas = new DrawCanvas();
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
Container cp = getContentPane();
cp.setLayout(new GridLayout(4,5));
cp.add(canvas,f1);
cp.add(btnPanel,f1);
cp.add(CentrePanel,f1);
cp.add( DownPanel,f1);
cp.setPreferredSize(new Dimension(CANVAS_WIDTH, 2*CANVAS_HEIGHT));
pack();
/* // "this" JFrame fires KeyEvent
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
switch(evt.getKeyCode()) {
case KeyEvent.VK_LEFT:
x -= 10;
y -= 10;
repaint();
break;
case KeyEvent.VK_RIGHT:
x += 10;
y += 10;
repaint();
break;
}
}
});*/
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Handle the CLOSE button
setTitle("Move a Line");
pack(); // pack all the components in the JFrame
setVisible(true); // show it
requestFocus(); // set the focus to JFrame to receive KeyEvent
}
/**
* DrawCanvas (inner class) is a JPanel used for custom drawing
*/
private class DrawCanvas extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // paint parent's background
setBackground(Color.BLACK);
g.setColor(Color.BLUE);
g.fillOval(x, y, size, size); // draw a circle
}
}
}
首先是一些一般性问题:
cp.add(canvas,f1);
这不是使用add方法的方式。第二个参数是布局管理器使用的“约束”,而不是实际的布局管理器本身。请阅读上的Swing教程中的部分以了解更多一般信息。可以从BorderLayout开始查看约束是如何指定的
cp.add(CentrePanel,f1);
cp.add( DownPanel,f1);
变量名不应以大写字符开头。你的名字大部分是对的,其他人则不是。保持一致
JButton btnDn = new JButton("Move Down");
变量名应该是有意义的。不要缩短名字。使用“按钮向下”
。您将您的面板称为“下面板”。再次强调,保持一致。短名称不能节省空间
我无法将“上移”和“下移”按钮置于位置
可以使用具有不同布局管理器的多个面板来实现布局
因此,我将使用框架的默认布局管理器,即BorderLayout
然后我会将您的游戏面板添加到中心
。接下来,我将为按钮创建一个单独的面板,然后将按钮添加到该面板,并将该面板添加到页面的末尾
这样可以将组件分解为逻辑面板
因此,您的代码类似于:
Containercp = getContentPane();
//cp.setLayout(new GridLayout(4,5));
//cp.add(canvas, f1);
//cp.add(btnPanel,f1);
//cp.add(CentrePanel,f1);
//cp.add(DownPanel,f1);
add(canvas, BorderLayout.CENTER);
Box pageEnd = Box.createVerticalBox();
btnUp.setAlignmentX(0.5f);
pageEnd.add(btnUp);
pageEnd.add(CentrePanel);
btnDn.setAlignmentX(0.5f);
pageEnd.add(btnDn);
add(pageEnd, BorderLayout.PAGE_END);
注:我将向上/向下按钮直接添加到面板上,但我需要将对齐方式更改为.5f,以使按钮在面板中水平居中。首先是一些常见问题:
cp.add(canvas,f1);
这不是使用add方法的方式。第二个参数是布局管理器使用的“约束”,而不是实际的布局管理器本身。请阅读上的Swing教程中的部分以了解更多一般信息。可以从BorderLayout开始查看约束是如何指定的
cp.add(CentrePanel,f1);
cp.add( DownPanel,f1);
变量名不应以大写字符开头。你的名字大部分是对的,其他人则不是。保持一致
JButton btnDn = new JButton("Move Down");
变量名应该是有意义的。不要缩短名字。使用“按钮向下”
。您将您的面板称为“下面板”。再次强调,保持一致。短名称不能节省空间
我无法将“上移”和“下移”按钮置于位置
可以使用具有不同布局管理器的多个面板来实现布局
因此,我将使用框架的默认布局管理器,即BorderLayout
然后我会将您的游戏面板添加到中心
。接下来,我将为按钮创建一个单独的面板,然后将按钮添加到该面板,并将该面板添加到页面的末尾
这样可以将组件分解为逻辑面板
因此,您的代码类似于:
Containercp = getContentPane();
//cp.setLayout(new GridLayout(4,5));
//cp.add(canvas, f1);
//cp.add(btnPanel,f1);
//cp.add(CentrePanel,f1);
//cp.add(DownPanel,f1);
add(canvas, BorderLayout.CENTER);
Box pageEnd = Box.createVerticalBox();
btnUp.setAlignmentX(0.5f);
pageEnd.add(btnUp);
pageEnd.add(CentrePanel);
btnDn.setAlignmentX(0.5f);
pageEnd.add(btnDn);
add(pageEnd, BorderLayout.PAGE_END);
注:我将向上/向下按钮直接添加到面板上,但我需要将对齐方式更改为.5f,以使按钮在面板中水平居中。绝对布局是否有帮助?绝对布局是否有帮助?非常感谢您的回答。它按照我希望的方式工作。只是为了更深入地了解事物的工作原理,此时,我的“moveUp”按钮连接到画布窗格,“movedown”按钮连接到“容器cp”的底部。我尝试使用setAlignmentY方法调整它们的位置,但对它们没有影响。简而言之,我想在“moveDn”按钮和“容器cp”的底部之间创建一些距离“moveUp”按钮和画布框架之间的距离,我该怎么做呢?提前谢谢你它按照我想要的方式工作
-很高兴它有帮助。不要忘记通过点击复选标记来“接受”答案,这样人们就知道问题已经解决。我想创造一些距离
-阅读我在“布局管理器”上演示的教程链接。使用BoxLayout,您可以创建“垂直支柱”,以便在零部件前后留出空间。或者在本教程中,您也可以查看“如何使用边框”部分,该部分为面板提供了空间。非常感谢您的回复。它按照我希望的方式工作。为了更深入地了解事物的工作原理,目前我的“moveUp”按钮已连接到画布窗格和“movedown”按钮连接到“容器cp”的底部。我曾尝试使用SetAlignment方法调整它们的位置,但对它们没有影响。简言之,我想在“moveDn”按钮和“容器cp”的底部之间创建一些距离,“moveUp”按钮和画布框之间创建一些距离,我该怎么做呢?提前谢谢你它按照我想要的方式工作
-很高兴它能帮上忙。不要忘记通过点击复选标记来“接受”答案,这样人们就知道问题已经解决。我想创造一些距离
-阅读我在“布局管理器”上演示的教程链接。使用BoxLayout,您可以创建“垂直支柱”,以便在零部件前后留出空间。或者,在本教程中,您还可以查看“如何使用边框”部分,该部分为面板提供了空间。