在画布上使用JButton

时间:2018-07-25 20:28:04

标签: java swing jframe awt

我目前正在尝试在JFrame窗口中为正在开发的测试游戏创建原始HUD。在这样做的过程中,我所有的尝试都受到挫败。要么包含所有用于表示HUD的按钮的面板都不显示,要么,我尝试绘制的Canvas似乎不存在,因为我没有绘制任何图形。

相信的问题是,这些层没有“重叠”,因此一个层遮挡了另一层。但是,我尝试使用Flowlayout()(仅用于测试目的),但仍然无法解决我的问题。因此,现在,我对尝试使用HUD按钮/标签感到茫然。

出于视觉目的,我正在尝试执行以下操作:

Example image

但是我实际上正在得到这个(只是一个测试图块,没有HUD): enter image description here 这是其中涉及的代码:

public static void createDrawFrame(int width, int height) {


    f = new JFrame();
    c = new Canvas();

    c.setPreferredSize(new Dimension(width, height));
    c.setFocusable(false);

    f.add(c);
    f.pack();

    f.setSize(width, height);

    f.setLocationRelativeTo(null);

public static JFrame getDrawFrame() {

    f.setVisible(true);

    return f;
}

public static JFrame createHUD(JFrame f, Game game) {

    Panel p = new Panel();

    p.setLayout(new FlowLayout());
    p.setSize(100, 100);
    p.setLocation(300, 0);

    Button b0 = new Button("Settings");
    Button b1 = new Button("Exit");

    MenuListeners mListeners = new MenuListeners(game);

    b0.addActionListener(mListeners);
    b1.addActionListener(mListeners);

    p.add(b0);
    p.add(b1);
    f.add(p);


    return f;
}

在这里被称为

private void init() {

    Display.createDrawFrame(width, height);
    Display.createMenuFrame(width, height);

    this.f = Display.getDrawFrame();
    this.c = Display.getCanvas();
    this.f = HUDDisplay.createHUD(this.f, this);

    MapAssets.init();

}

并在此处呈现:

private void render() {

    b = c.getBufferStrategy();
    if(b == null) {
        c.createBufferStrategy(3);
        return;
    }


    do {
        do {

            g = b.getDrawGraphics();

            g.clearRect(0, 0, width, height);
            state.render(g);

            b.show();

        }while(b.contentsLost());

        g.dispose();

    }while(b.contentsRestored());

}

希望我已正确说明了此问题。回顾一下,我只想知道为什么我的按钮没有按原样显示在JFrame中。感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我认为您可以将JFrame的{​​{1}}的添加方法与画布和按钮一起使用。我更改了代码以显示(演示)它可以完成。我希望这是您想要的。

我使用如下代码将组件(带有按钮的BorderLayoutCanvas添加到Panel,以使其可见:

JFrame

这里有指向Oracle Swing上的Java教程的链接,以获取更多详细信息;请参阅Swing ComponentsLaying Out Components Within a Container上的部分。

示例代码:

frame.add(panel, BorderLayout.NORTH); // panel with buttons
frame.add(canvas, BorderLayout.CENTER);