所以,我正在尝试在java中创建一个简单的Pong程序。现在,它应该只是打开一个窗口,显示一个按钮(“开始”)并输出到控制台,如果你按下按钮。它会打开窗口,但不会绘制按钮。但是,如果单击我指定的区域,它会注册您单击并打印到控制台。
这是我的代码。
在窗口中打开的JPanel:
public class Menu extends JPanel {
Font garamond = new Font("Garamond", Font.PLAIN, 20);
public Menu() {
addMouseListener(new Mouse());
}
public void draw() {
Graphics g = getGraphics();
g.setColor(Color.BLACK);
g.drawRect(0, 0, 100, 100);
g.setFont(garamond);
g.setColor(Color.WHITE);
g.drawString("Start", 10, 10);
g.dispose();
}
注册点击次数的“鼠标”类:
public class Mouse extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.getX() >= 0 && e.getX() <= 100 && e.getY() >= 0 && e.getY() <= 100) {
Frame.buttonStart();
}
}
最后打开窗口并显示面板的“Frame”类:
public class Frame {
static JFrame frame = new JFrame("Java Pong");
public static void initialize() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setLocation(100, 100);
frame.setVisible(true);
setMode("menu");
}
public static void setMode(String Mode) {
switch (Mode) {
case "menu":
Menu menu = new Menu();
frame.getContentPane().add(menu, BorderLayout.CENTER);
menu.draw();
break;
default:
break;
}
}
public static void buttonStart() {
System.out.println("yeh button pressed");
}
答案 0 :(得分:4)
您应该覆盖paintComponent()
以执行自定义绘图。在传递给它的Graphics
对象上绘制。
此外,您应该使用SwingUtilities.invokeAndWait()
或SwingUtilities.invokeLater()
在事件调度线程上执行Swing组件的所有操作。这包括实例化和配置UI组件。
此外,如果您想要一个按钮,那么使用JButton
而不是滚动自己的按钮会让您大吃一惊。
已编辑添加:
使用SwingUtilities.invokeAdWait()
:
SwingUtilities.invokeAdWait(
new Runnable() {
@Override public void run() {
// the work to be performed by the EDT goes here
Frame.frame.pack();
Frame.frame.setVisible(true);
}
}
);
只要在最初显示GUI时使用invokeAndWait()
,您就可以在主线程中完成大部分初始设置。之后你应该让主线程死掉。