因此,我试图用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");
}
最佳答案
您应该覆盖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()
,就可以在主线程中完成很多初始设置。之后,您可能应该让主线程死掉。