Java 使用JPanel'绘制;s getGraphics()?
我在这里碰到了一堵墙。在试图解决此问题时,我在别处读到,您永远不应该获取Graphics()。问题是,我无法使用paint()/paintComponent()方法提供的图形上下文。我要求它只调用我的generate(Graphics g)函数一次,我不能提供覆盖函数之外的图形 有什么建议吗?为您的方便修剪Java 使用JPanel'绘制;s getGraphics()?,java,swing,Java,Swing,我在这里碰到了一堵墙。在试图解决此问题时,我在别处读到,您永远不应该获取Graphics()。问题是,我无法使用paint()/paintComponent()方法提供的图形上下文。我要求它只调用我的generate(Graphics g)函数一次,我不能提供覆盖函数之外的图形 有什么建议吗?为您的方便修剪 public class Main extends JPanel { ... static JFrame displayFrame, inputFrame; ... ... // Ge
public class Main extends JPanel {
...
static JFrame displayFrame, inputFrame;
...
...
// Generator node list
ArrayList<Node> nodes = new ArrayList<Node>();
public static void main(String[] args) {
// Set up the frame
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
displayFrame = new JFrame("City generator");
displayFrame.setSize(screenSize.width / 3, screenSize.width / 3);
displayFrame.setLocation(screenSize.width / 2 - displayFrame.getWidth()
/ 2, screenSize.height / 2 - displayFrame.getHeight() / 2);
displayFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
displayFrame.add(new Main());
// displayFrame.setUndecorated(true);
displayFrame.setBackground(Color.lightGray);
displayFrame.setVisible(true);
displayFrame.addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
// Mouse movement events here
}
});
}
// Override function
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Calls multiple times
generate(g);
}
private void generate(Graphics g) {
............................
public类Main扩展了JPanel{
...
静态JFrame显示框、输入框;
...
...
//生成器节点列表
ArrayList节点=新的ArrayList();
公共静态void main(字符串[]args){
//架起架子
screenSize=Toolkit.getDefaultToolkit().getScreenSize();
displayFrame=新JFrame(“城市生成器”);
displayFrame.setSize(screenSize.width/3,screenSize.width/3);
displayFrame.setLocation(screenSize.width/2-displayFrame.getWidth()
/2,screenSize.height/2-displayFrame.getHeight()/2);
displayFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(newmain());
//displayFrame.setUndecorated(真);
显示框.背景(颜色.浅灰色);
displayFrame.setVisible(真);
displayFrame.addMouseMotionListener(新的MouseAdapter(){
public void mouseMoved(MouseEvent e){
//这里有鼠标移动事件
}
});
}
//覆盖功能
公共组件(图形g){
超级组件(g);
//多次打电话
生成(g);
}
专用void生成(图形g){
............................
如果调用了generate(),为什么不保留一个布尔值来跟踪呢
public boolean calledGenerate = false;
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!calledGenerate) generate(g);
}
void generate(Graphics g) {
calledGenerate = true;
....
}
另外,您在EDT之外调用AWT/Swing代码,这是一个坏主意。在main函数中,通常应调用:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
//build your awt/swing objects here
}
});
generate()的作用是什么?可能有更好的方法。不直接绘制到
图形
上下文,您可以生成要绘制的缓冲图像
图像并绘制到该图像上
private BufferedImage buffer;
public BufferedImage generate() {
if (buffer == null) {
buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_IMAGE_ARGB);
Graphics2D g2d = buffer.createGraphics();
// Paint away...
g2d.dispose();
}
return buffer;
}
然后在paintComponent
方法中绘制结果
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Calls multiple times
BufferedImage img = generate();
g.drawImage(img, 0, 0, this);
}
例如…“无法使用paint()/paintComponent()方法提供的图形上下文”为什么?如果你只想调用
generate
一次,然后将内容绘制到BufferedImage
并返回结果…仅在缓冲区为null
时生成第一个图像…对不起,我应该用更好的措辞。我希望在实现动画时多次绘制图像,但只生成“第一个”图像一次。生成(g)函数创建场景(创建不同的节点,通过Voronoi图连接,应用噪声)然后绘制。因此,将基础图像渲染到某种缓冲区,然后绘制……我正在从论文中重新创建一个程序化城市生成器,生成它所说的以及绘制(使用图形g)。布尔值似乎很明显,但我尝试过,但没有成功。我完全不知道为什么!因此,当调用paintComponent
get并用组件的背景色清除Graphics
上下文时,它将调用generate
并…不绘制任何内容…因此,充其量,您可能会看到它生成了什么在绘制周期之间的几秒钟内,我不会考虑不调用super.paintComponent
或将背景设置为透明,因为这也不起作用。。。