gpt4 book ai didi

java - Swing Canvas 没有按预期绘制(或根本没有绘制)

转载 作者:行者123 更新时间:2023-12-04 05:52:19 27 4
gpt4 key购买 nike

public class TerrisView extends JFrame {
public Canvas canvas;

public TerrisView(String title) {
super(title);
canvas = new Canvas();
canvas.setSize(300, 400);
canvas.setBackground(Color.WHITE);
// setSize(300, 400);
this.add(canvas, BorderLayout.CENTER);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
paint();

}

public void paint() {

// this.createBufferStrategy(2);
// Graphics gp=getBufferStrategy().getDrawGraphics();
// gp.setColor(Color.RED);
// gp.fillRect(100, 100, 50, 50);
// getBufferStrategy().show();
Graphics gp = canvas.getGraphics();
gp.setColor(Color.BLACK);
gp.fillRect(0, 0, 10, 10);

}

}

为什么画不出来 Rect在 Canvas 上?代码有什么问题?

最佳答案

  • 不要在没有充分理由的情况下将 Swing 与 AWT 组件混合使用。
  • 在这种情况下:
  • 扩展 JComponent而不是 Canvas
  • 覆盖 paintComponent(Graphics)而不是 paint(Graphics)


  • 在我格式化该代码之前,我没有注意到 paint()不是覆盖,这个经典..
    Graphics gp = canvas.getGraphics();

    不要对组件这样做。使用 Graphics传递给第 2 点中提到的方法的对象,并在被告知这样做时绘制。

    这个答案已经被接受,但我忍不住审查和清理源代码以制作 SSCCE,并添加一些更多的调整。有关更多提示,请参阅代码中的注释。
    import java.awt.*;
    import javax.swing.*;

    public class TerrisView {

    public JComponent canvas;

    public TerrisView(String title) {
    // Don't extend frame, just use one
    JFrame f = new JFrame(title);
    canvas = new JComponent() {
    @Override // check this is a real method
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // paint the BG - automatic for a JPanel
    g.setColor(getBackground());
    g.fillRect(0,0,getWidth(),getHeight());

    g.setColor(Color.BLACK);
    // make it dynamic, changing with the size
    int pad = 10;
    g.fillRect(pad, pad, getWidth()-(2*pad), getHeight()-(2*pad));
    }
    };
    // layout managers are more likely to respect the preferred size
    canvas.setPreferredSize(new Dimension(300, 400));
    canvas.setBackground(Color.ORANGE);
    f.add(canvas, BorderLayout.CENTER);
    f.pack();
    // nice tweak
    f.setMinimumSize(f.getSize());
    // see http://stackoverflow.com/a/7143398/418556
    f.setLocationByPlatform(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }

    public static void main(String[] args) {
    // start/alter Swing GUIs on the EDT
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    new TerrisView("Terris View");
    }
    });
    }
    }

    关于java - Swing Canvas 没有按预期绘制(或根本没有绘制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935275/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com