[英]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
一樣。
因此,您的問題的答案是:
GameBoard
添加到可以解析為基於窗口的類的容器中 paint
或paintComponent
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.