Java JPanel中带BoxLayout的按钮在带Overlaylayout的JPanel中的JLabel上的定位

Java JPanel中带BoxLayout的按钮在带Overlaylayout的JPanel中的JLabel上的定位,java,swing,Java,Swing,我正在为我的游戏制作菜单。我希望背景是动画。因此,我使用带有gif的JLabel。最重要的是我要我的纽扣。但是,我想在按钮和窗户左侧之间透透气。这给我带来了麻烦 这是我的结果。非常好!但是我不能让灰色的条消失!另外,我的背景JLabel似乎被推到了右边 我有三门课: 1创建JFrame的启动器 public class Launcher extends JFrame{ public int speed = 0; int c = 0; public final stat

我正在为我的游戏制作菜单。我希望背景是动画。因此,我使用带有gif的JLabel。最重要的是我要我的纽扣。但是,我想在按钮和窗户左侧之间透透气。这给我带来了麻烦

这是我的结果。非常好!但是我不能让灰色的条消失!另外,我的背景JLabel似乎被推到了右边

我有三门课:

1创建JFrame的启动器

public class Launcher extends JFrame{

    public int speed = 0;

    int c = 0;
    public final static int WIDTH = 1200;
    public final static int HEIGHT = 800;
    Game game;
    JFrame frame;


    public static void main(String[] args) throws IOException{

        new Launcher();


    }

    public Launcher() throws IOException{

        game = new Game();
        JFrame frame = new JFrame("PingPong!");
        frame.add(game);
        frame.setFocusable(true);
        frame.setPreferredSize(new Dimension(WIDTH, HEIGHT) );
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);



    }




}
2使用OverlyLayout创建JPanel的游戏

public class Game extends JPanel implements Runnable{

    public State menuState;


    public Game() throws IOException{
        this.removeAll();
        this.setLayout(new OverlayLayout(this));

        menuState = new MenuState(this, handler);
    }
}
最后是我的MenuState,它创建了一个带有BoxoLayout的JPanel,我在其中添加了元素

public class MenuState extends State{

    JPanel menuPanel;

    JLabel background;

    private Icon backgroundIcon;

    private Icon newgameIcon;
    private Icon loadgameIcon;

    private JButton newGame;
    private JButton loadGame;

    Border border;

    public MenuState(Game game, Handler handler) {
        super(game, handler);       

        init();


    }       

    public void init(){

        menuPanel = new JPanel();
        menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.PAGE_AXIS));
        menuPanel.setBackground(Color.green);
        menuPanel.add(Box.createHorizontalStrut(100));
        menuPanel.setVisible(true);
        menuPanel.setOpaque(false);



        Box left = Box.createVerticalBox();

        backgroundIcon = new ImageIcon("res/images/menu/back.gif");
        background = new JLabel(backgroundIcon);

        newGame = new JButton("New Game");  
        loadGame = new JButton("Load Game");

        game.add(menuPanel);

        menuPanel.add(newGame);


        left.add(newGame);
        left.add(Box.createRigidArea(new Dimension(0, 40)));
        left.add(loadGame);
        left.add(Box.createRigidArea(new Dimension(0, 300)));
        left.setOpaque(false);


        menuPanel.add(left);

        background.setSize(1200, 800);
        game.add(background);   


    }


}
我尝试了添加组件的不同顺序。我试过真假

我希望我能设置newGame.setLocation100500,然后把盒子放在我想要的地方

但是,我想在按钮和窗户左侧之间透透气

将按钮添加到JPanel并使JPanel不不透明。 然后,您可以向面板添加一个清空命令,以给出面板内的按钮间距。 然后使用适当的alignmentx/y值将面板添加到覆盖布局中。 您可以使用此处的演示代码玩对齐值:

如果我了解您的要求,您应该使用setAlignmentX0.0和setAlignmentY0.5

因此,简单地说,您的代码应该是:

JLabel background = new JLabel(...);
background.setAlignmentX(0.0f);
background.setAlignmentY(0.5f);

JPanel buttonsPanel = new JPanel( set your layout );
buttonsPanel.setOpaque( false );
buttonsPanel.setBorder( new EmptyBorder(...) );
buttonsPanel.setAlignmentX(0.0f);
buttonsPanel.setAlignmentY(0.5f);

JPanel overlayPanel = new JPanel( new OverLayLayout(...) );
overlayPanel.add(background);
overlayPanel.add(buttonsPanel);

嘿,这很有效!我坐在每个面板上对齐,这没什么作用。我添加了空订单,成功了!我想我需要仔细阅读setAlignment的功能。非常感谢D