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

10-04 10:48