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,您可以创建“垂直支柱”,以便在零部件前后留出空间。或者,在本教程中,您还可以查看“如何使用边框”部分,该部分为面板提供了空间。