簡體   English   中英

使用Java Swing Graphics G在JPanel中繪制

[英]Draw in JPanel with java swing Graphics g

這是我的第一個Java項目,我試圖在JFrame的JPanel上繪制一個簡單的矩形。 試圖通過關於stackoverflow的相同主題來解決此問題,但仍然沒有成功。 運行程序時遇到的異常是java.lang.NullPointerException。 據我了解,我不能依靠JPanel本身嗎? 在mainWindow中創建的。

主要:

public class Main {
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GameBoard game = new GameBoard();
                mainWindow view = new mainWindow(game);
                mainModel model = new mainModel();
                mainController cont = new mainController(model, view, game);

                cont.controllerInit();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}

視圖:

public class mainWindow{
public JFrame frame;
public JPanel panel;

    GameBoard game = new GameBoard();
    frame = new JFrame();
    frame.getContentPane().setBackground(SystemColor.control);
    frame.setBounds(100, 100, 728, 435);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(game);
    frame.getContentPane().setLayout(null);

    panel = new JPanel();                           
    FlowLayout flowLayout = (FlowLayout) panel.getLayout();
    panel.setBounds(166, 44, 550, 349); 
    frame.getContentPane().add(panel);

    frame.setVisible(true);
}

游戲:

public class GameBoard extends JPanel{

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.drawRect(200, 200, 200, 200);
}

}

永遠不要直接調用paintComponent ,沒有任何外部來源可以這樣做。 此外,如果將其傳遞為null會發生什么情況?

您應該先看看在AWT和Swing執行自定義繪畫以及繪畫,以更好地了解Swing中的繪畫工作原理。

Swing API基本上使用委托模型,在該模型中,系統將每個組件的繪制職責委托給該組件。 這是通過系統調用組件paint方法來實現的,該方法依次調用(其他方法中) paintComponent

Swing還使用被動渲染方法,這意味着繪畫是由繪畫系統自行決定的。 當組件的paint方法被調用時,組件會收到需要的通知。 這可能隨時發生。

為了繪制組件,必須首先將其添加到在屏幕上實現的容器中(具有本機對等體),在大多數情況下,這意味着組件層次結構需要解析為某種基於窗口的類,就像JFrame一樣。

因此,您的問題的答案是:

  • 閱讀上述文檔(並更好地了解API的工作原理)
  • 將您的GameBoard添加到可以解析為基於窗口的類的容器中
  • 切勿直接調用paintpaintComponent

反射....

private mainWindow view;
private mainModel model;
public GameBoard(mainModel m, mainWindow v)
{
    view = v;
    model = m;
}

對我來說,這沒有任何意義。 沒有合理的理由說明GameBoard需要引用mainWindow GameBoard本身就是一個“視圖”。 如果有的話,您“應該”傳遞給GameBoard的唯一東西(假設您嘗試使用MVC)是控制器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM