我想为游戏乒乓球创建一个简单的游戏菜单。在背景中有一个球在边缘反弹,只是为了看起来漂亮。现在我想在这个菜单屏幕上添加按钮。但是背景不再画了。所以我想画一个实时背景,但是按钮应该仍然留在前面。这个实时背景是用循环实现的。下面是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();
}
这是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);
}
}
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);
代码的其他问题:
paintcompont(…)
不绘制(…)
不要在绘制方法中调用repaint()。Swing将决定部件何时重新喷漆
在框架可见之前,应将组件添加到框架中
不要试图挫败(…)组件。Swing设计用于布局管理器。为所需布局使用适当的布局管理器
编辑:
所以你知道如何:
将组件添加到面板
因此,要结合这两个概念,您可以修改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与透明背景 但这对我不起作用。当我粘贴到画布上时,我最终得到: 我需要它紧紧地围绕着油