我是JAVA的初学者,我对以下问题感到不满:
为什么此代码无法绘制
import ...
public class tekening extends JFrame{
private JPanel p;
private Graphics g;
tekening(){
setLayout(new FlowLayout());
p = new JPanel();
p.setPreferredSize(new Dimension(350, 350));
p.setBackground(Color.WHITE);
add(p);
setLocationByPlatform(true);
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
g = p.getGraphics();
g.setColor(Color.BLACK);
g.drawRect(30, 30, 80, 40);
g.drawLine(10, 10, 40, 50);
}
}
为什么这段代码会吸引
import ...
public class tekenclasse extends JFrame implements ActionListener{
private JPanel p;
private Graphics g;
private JButton button1;
tekenclasse(){
setLayout(new FlowLayout());
button1 = new JButton("Knop 1");
button1.addActionListener(this);
add(button1);
p = new JPanel();
p.setPreferredSize(new Dimension(350, 350));
p.setBackground(Color.WHITE);
add(p);
setLocationByPlatform(true);
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
g = p.getGraphics();
g.setColor(Color.BLACK);
g.drawRect(30, 30, 80, 40);
g.drawLine(10, 10, 40, 50);
}
}
对我来说,这完全是奇怪的。为什么我不能在构造函数中使用Graphics。为什么我可以在活动结束后使用它。这是愚蠢的我想立即画画,我不想按一个按钮。
答案 0 :(得分:3)
切勿使用getGraphics()
进行绘画。
请勿尝试在JFrame
相反(如Performing Custom Painting - 必须阅读),使用JPanel
(或JComponent
)并覆盖其protected void paintComponent(Graphics g)
方法。使用该图形上下文来进行绘画。所有绘画都应该在图形上下文提供的范围内完成,无论是直接在paintComponent
方法中编写代码,还是调用将Graphics
对象作为参数传递给它的方法。
覆盖public Dimension getPreferredSize()
中的JPanel/JComponent
,为您提供绘画表面的首选尺寸。将pabel添加到框架,然后pack()
框架。
public class DrawPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.draw... // do all your drawing here
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}
重要提示:在发布有关绘画的其他问题之前,您必须阅读有关自定义绘画的链接,否则您将获得打屁股:-)