当前位置: 首页 > 知识库问答 >
问题:

背景没有画出来

百里成仁
2023-03-14

我想为游戏乒乓球创建一个简单的游戏菜单。在背景中有一个球在边缘反弹,只是为了看起来漂亮。现在我想在这个菜单屏幕上添加按钮。但是背景不再画了。所以我想画一个实时背景,但是按钮应该仍然留在前面。这个实时背景是用循环实现的。下面是GUI类和DrawStartMenueClass。

我听说过图层,但是每个人都在NetBeans中用某种工具来使用它们,我有日蚀,所以我没有那个机会。我想你可以把按钮和背景放在不同的容器中,但是我不确定怎么做。欢迎任何帮助。


public class GUI {



    public GUI() {

        //Frame erzeugen
        Var.frame = new JFrame("Pong");
        Var.frame.setSize(Var.dimension);
        Var.frame.setVisible(true);
        Var.frame.setResizable(true);
        Var.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Var.frame.setLocationRelativeTo(null);

        //Komponenten erzeugen
        Var.start = new JButton("Start");
        Var.optionen = new JButton("Optionen");
        Var.modus = new JButton("Modus");
        Var.skins = new JButton("Skins");
        Var.beenden = new JButton("Beenden");

        //Komponenten anpassen
        Var.start.setBounds((Var.screenWidth / 2) - (Var.buttonWidth / 2), 400, Var.buttonWidth, 50);
        Var.optionen.setBounds((Var.screenWidth / 2) - (Var.buttonWidth / 2), 500, Var.buttonWidth, 50);
        Var.modus.setBounds((Var.screenWidth / 2) - (Var.buttonWidth / 2), 600, Var.buttonWidth, 50);
        Var.skins.setBounds((Var.screenWidth / 2) - (Var.buttonWidth / 2), 700, Var.buttonWidth, 50);
        Var.beenden.setBounds((Var.screenWidth / 2) - (Var.buttonWidth / 2), 800, Var.buttonWidth, 50);

        //Komponenten hinzufügen
        Var.frame.getContentPane().add(new DrawStartMenue());
        Var.frame.add(Var.start);
        Var.frame.add(Var.optionen);
        Var.frame.add(Var.modus);
        Var.frame.add(Var.skins);
        Var.frame.add(Var.beenden);

    }

}

package main;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.RenderingHints;

import javax.swing.JPanel;


public class DrawStartMenue extends JPanel{

    private static final long serialVersionUID = 1L;
    private GridLayout experimentLayout = new GridLayout(6,1);


    public Graphics2D g2d;

    public void paint(Graphics g) {

        //Objekt g zum Zeichnen erzeugen
        super.paintComponent(g);
        g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


        //Hintergrund
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0,  0,  Var.screenWidth,  Var.screenHeight);
        g2d.setColor(Color.WHITE);
        g2d.setStroke(new BasicStroke(8));
        g2d.drawRect(Var.whiteRectX1, Var.whiteRectY1 , Var.whiteRectWidth, Var.whiteRectHeight);

        //Ball im Hintergrund
        for(int i = 0; i < Var.ballList.size(); i++) {
            g2d.fillOval(Var.ballList.get(i).ballX, Var.ballList.get(i).ballY,
                         Var.ballList.get(i).ballWidth, Var.ballList.get(i).ballHeight);
        }

        //Schriftzug
        drawCenteredString(g, "PONG", Var.rect, new Font("NO CONTINUE", Font.PLAIN, 230));
        repaint();


    }

共有2个答案

梁鸣
2023-03-14

这是MRE。我终于让它工作了。然而它在我的项目中不起作用。

package main;

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GUI {

    static JFrame frame;
    static JPanel buttons;
    static JPanel background;
    static JButton test1;
    static JButton test2;

    public static void main(String[] args) {

        frame = new JFrame();
        frame.setResizable(false);
        frame.setSize(600,  400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        //Initzialize Components
        buttons = new JPanel();
        buttons.setBackground(Color.BLACK);

        background = new JPanel();
        background.setBackground(Color.BLACK);

        test1 = new JButton("Test1");
        test2 = new JButton("Test2");


        //Adding the Buttons
        buttons.add(test1);
        buttons.add(test2);

        //Adding panels to JFrame
        frame.add(background);
        //frame.add(buttons);

        background.add(buttons);

        frame.setVisible(true);




    }

}
盖向荣
2023-03-14
    Var.frame.getContentPane().add(new DrawStartMenue());
    Var.frame.add(Var.start);
    Var.frame.add(Var.optionen);
    Var.frame.add(Var.modus);
    Var.frame.add(Var.skins);
    Var.frame.add(Var.beenden);

JFrame的默认布局是边框布局。在不指定约束的情况下将构件添加到框架时,构件将添加到中心。只能将一个组件添加到中心。因此,只有最后添加的一个可见。

如果希望按钮位于背景上,则需要将按钮添加到背景面板,而不是框架:

    JPanel background = new DrawStartMenue();
    Var.frame.add(background, BorderLayout.CENTER);
    background.add(Var.start);
    background.add(Var.optionen);
    background.add(Var.modus);
    background.add(Var.skins);
    background .add(Var.beenden);

代码的其他问题:

  1. 自定义绘制是通过覆盖paintcompont(…) 不绘制(…)
  2. 不要在绘制方法中调用repaint()。Swing将决定部件何时重新喷漆
  3. 在框架可见之前,应将组件添加到框架中
  4. 不要试图挫败(…)组件。Swing设计用于布局管理器。为所需布局使用适当的布局管理器

编辑:

所以你知道如何:

  1. 将组件添加到面板

因此,要结合这两个概念,您可以修改SwingPaintDemo2代码,如下所示:

//f.add(new MyPanel());
JPanel panel = new MyPanel();
panel.add( new JButton("Testing") );
f.add(panel);

所以,要知道你知道基本知识,你要把这些知识用在你真正的代码上。

别忘了,你永远不应该在绘画方法中调用repaint。我已经向您展示了如何在动画中使用摆动计时器。

接下来,如果你不喜欢按钮的位置,那么你可以在我的面板类上使用不同的布局管理器。如果你需要布局管理器的帮助,那么Swing教程还有一个关于布局管理器的部分,里面有工作示例供你下载和测试。

 类似资料:
  • 我正在尝试创建背景色CSS3关键帧动画后的第一个动画,这是一个背景图像。我无法创建另一个动画后,文字动画淡出。文本动画褪色后,我想背景的不透明度转到0.3,并再次褪色在文本。下面是我所拥有的。 请在此处查看完整代码:codepen:https://codepen.io/imdaone/pen/jjryyv

  • 我的组件没有显示。我该如何解决这个问题? 法典: 结果:

  • 有没有办法给text()一个背景颜色? 示例代码: 我希望这篇文章有一个背景颜色。 谁能帮我一下吗 编辑:text()方法位于draw()中

  • 我有一个带有背景图像的HTML5画布元素。用户被允许在图像上绘制,然后需要保存完整的画布元素与背景。我使用下面的代码保存部分,但它只得到画布绘图,而不是背景图像。我还可以做什么来获得背景图像? 更新: 我的HTML 我有上面的div在我的HTML页面。然后我动态地创建画布并在其上绘制。这是一个有点长的代码。

  • 我正在尝试导出一个带有透明背景的matplotlib绘图,因为它是一个圆,我需要粘贴到另一个画布上(没有角)。 我遵循了这里的示例:如何使用透明背景从matplotlib导出绘图? 示例代码: 这里给出的示例是:如何使用Matplotlib设置图形背景颜色的不透明度 示例代码: 以及这里的例子:导出图在. png与透明背景 但这对我不起作用。当我粘贴到画布上时,我最终得到: 我需要它紧紧地围绕着油