面板为什么不画?

sap*_*Pro 3 java swing colors java-2d paintcomponent

import javax.swing.*;
import java.awt.*;

class tester {
   public static void main(String args[]) {
     JFrame fr = new JFrame();
     JPanel p = new JPanel();
     p.setBackground(Color.RED);
     p.paintImmediately(20,20,500,500);  
     fr.add(p);
     fr.setVisible(true);
     fr.setSize(2000,2000);
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个完全是红色的面板.为什么我不接线?我怎么才能得到它?

aio*_*obe 8

我得到一个完全涂成红色的面板.

那是因为你设置背景并且没有做任何进一步的绘画......

为什么我不接受这条线路?我怎么才能得到它?

这不是这样做的方法.你为什么打电话paintImmediately?以下是文档说的内容:

立即绘制此组件中指定区域及其与区域重叠的所有后代.

这是很少需要调用此方法.在大多数情况下,调用重绘效率更高,这会延迟实际绘制并将冗余请求折叠为单个绘制调用.如果在调度当前事件时需要更新显示,则此方法很有用.

我建议你阅读AWT/Swing中的绘画.


得到这样的东西

在此输入图像描述

你可以改变你的代码:

JFrame fr = new JFrame();
JPanel p = new JPanel() {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(20, 20, 500, 500);
    }
};
p.setBackground(Color.RED);
fr.add(p);
fr.setVisible(true);
fr.setSize(200, 200);
Run Code Online (Sandbox Code Playgroud)

  • 不,你不能打电话给`g.drawLine`并期望它永远留在面板上.这不是它的工作原理.(然后你必须在一些缓冲的图像上绘制线条,然后将图像绘制到面板上.)你不能保持你的代码相同,只需添加一个"绘画线".我提供的代码是最接近您的代码的解决方案. (3认同)