Java Graphics没有绘制任何东西

时间:2014-11-07 20:23:36

标签: java swing graphics jframe jpanel

所以,我正在尝试在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");

}

1 个答案:

答案 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(),您就可以在主线程中完成大部分初始设置。之后你应该让主线程死掉。