使用JPanel的getGraphics()绘图?

时间:2014-10-21 02:03:03

标签: java swing

我在这里碰到了一堵墙。我在尝试解决这个问题时在其他地方读到了你永远不应该得到的图形()。问题是,我无法使用paint()/ paintComponent()方法中提供的Graphics上下文。我要求它只调用我的generate(Graphics g)函数一次,并且我不能在覆盖函数之外提供Graphics。

任何提示?为方便起见修剪。

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) {
............................

2 个答案:

答案 0 :(得分:1)

而不是直接绘制到Graphics上下文,您可以生成一个BufferedImage图像,其中包含您想要绘制的内容并将其绘制为...

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);
}

作为一个例子......

答案 1 :(得分:0)

为什么不保留一个布尔值来跟踪是否已调用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代码,这是一个坏主意 在您的主要功能中,您通常应该致电:

java.awt.EventQueue.invokeLater(new Runnable() {
  public void run() {
    //build your awt/swing objects here
  }
});

generate()做了什么?可能有更好的方法。