Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPanel'绘制;s getGraphics()?_Java_Swing - Fatal编程技术网

Java 使用JPanel'绘制;s getGraphics()?

Java 使用JPanel'绘制;s getGraphics()?,java,swing,Java,Swing,我在这里碰到了一堵墙。在试图解决此问题时,我在别处读到,您永远不应该获取Graphics()。问题是,我无法使用paint()/paintComponent()方法提供的图形上下文。我要求它只调用我的generate(Graphics g)函数一次,我不能提供覆盖函数之外的图形 有什么建议吗?为您的方便修剪 public class Main extends JPanel { ... static JFrame displayFrame, inputFrame; ... ... // Ge

我在这里碰到了一堵墙。在试图解决此问题时,我在别处读到,您永远不应该获取Graphics()。问题是,我无法使用paint()/paintComponent()方法提供的图形上下文。我要求它只调用我的generate(Graphics g)函数一次,我不能提供覆盖函数之外的图形

有什么建议吗?为您的方便修剪

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
或将背景设置为透明,因为这也不起作用。。。