【问题标题】:paintComponent isnt called没有调用paintComponent
【发布时间】:2014-11-16 16:20:04
【问题描述】:

在 JFrame 中,我有一些按钮和 BufferedImgae,它们将用于使用我自己的方法(drawLine、用像素绘制光栅图片像素等)在其上绘制一些形状和图片。 这是我向 JFrame 添加内容的方法

public class Main extends javax.swing.JPanel {

    JPanel panel;
    JFrame fr;

    Graphics2D g2;
    ImageIcon icon;
    BufferedImage img;

    public void init()
    {
        fr = new JFrame("Lab 2");
        fr.setMinimumSize(new Dimension(1350, 650));
        fr.setMaximumSize(fr.getMinimumSize());
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel glowny = new JPanel(new BorderLayout());
        glowny.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        glowny.add(getBorderCenter(), BorderLayout.CENTER); 
        fr.add(glowny);
        fr.pack();
        fr.setVisible(true);
    }

    private JScrollPane getBorderCenter()
    {
        img = new BufferedImage( fr.getWidth()-40, fr.getHeight()-40-50, BufferedImage.TYPE_INT_RGB); //20+20 odstępy w glowny, 50 - szerokość paska z guzikami
        icon = new ImageIcon(img); 
        return new JScrollPane(new JLabel(icon));
    }

    public static void main(String [] args)
    {
        Main m = new Main();
        m.init();
    }
}

然后我尝试使用双缓冲在 BufferedImage 上绘图。 以下示例将 BufferedImage 颜色从黑色(当前)更改为白色。

@Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("paintComponent");

        WritableRaster raster = img.getRaster();
        DataBuffer db = raster.getDataBuffer();

        int[] pixels = ((DataBufferInt)db).getData();        
        int adres = 0;
        for (int y = 0; y < img.getHeight(); y++) 
        {
            adres = y * img.getWidth();
            for (int x = 0; x < img.getWidth(); x++) 
            {
                pixels[adres] = 16777215;
                adres += 1;
            }
        }

        Graphics2D g2dComponent = (Graphics2D) g;
        g2dComponent.drawImage(img, null, 0, 0); // draw buffer on screen
    }

据我了解,repaint() 强制调用paintComponent()。问题是我如何调用 repaint() 并不重要

fr.repaint();
glowny.repaint();
repaint();

它从未调用过。

【问题讨论】:

  • 在哪个组件中覆盖paintComponent()
  • 如需更好的帮助,请尽快发布 SSCE。
  • 我不明白,所有代码都来自一个类

标签: java swing jframe paintcomponent repaint


【解决方案1】:

您永远不会将 Main 添加到 GUI。您需要将覆盖paintComponent 的JPanel,this,添加到GUI 的某个地方,而您不需要。例如,您需要类似以下内容:

someComponentShownInGui.add(this);

我会去掉 glenny 变量,而是使用 this

即,

public void init()
{
    fr = new JFrame("Lab 2");
    fr.setMinimumSize(new Dimension(1350, 650));
    fr.setMaximumSize(fr.getMinimumSize());
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // JPanel glowny = new JPanel(new BorderLayout());
    // glowny.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    // glowny.add(getBorderCenter(), BorderLayout.CENTER); 
    // fr.add(glowny);

    setLayout(new BorderLayout();
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    add(getBorderCenter(), BorderLayout.CENTER); 
    fr.add(this);

    fr.pack();
    fr.setVisible(true);
}

请注意,添加到绘图 JPanel 的任何组件都会掩盖其图像,因此您可能需要制作一些不透明的。

【讨论】:

    【解决方案2】:

    您应该在 JPanel 中添加所有组件,然后覆盖面板的 paintComponent 方法。 (JFrame没有paintComponet但有paint方法,不建议重写)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多