Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 为什么不是';面板没有漆吗?_Java_Swing_Colors_Java 2d_Paintcomponent - Fatal编程技术网

Java 为什么不是';面板没有漆吗?

Java 为什么不是';面板没有漆吗?,java,swing,colors,java-2d,paintcomponent,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.ad

代码

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);
  }
}
我把面板漆成了红色。为什么我不接电话?我怎样才能得到它

我得到一块完全涂成红色的面板。

那是因为你设置了背景,没有做进一步的绘画

我为什么不接电话?我怎样才能得到它?

这不是做这件事的方法。为什么要立即调用
油漆
?以下是文档中的内容:

绘制此组件中的指定区域及其所有 与区域重叠的子体,立即

很少需要调用此方法。在大多数情况下,这更重要 调用重新绘制非常有效,这会延迟实际绘制,并且可以 将冗余请求折叠为单个绘制调用。这种方法是可行的 如果需要在当前事件发生时更新显示,则此选项非常有用 被派遣

我建议你读一下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);

@好的,谢谢你。实际上,我想保持一切不变,只添加一条线。这就是我不想再次调用repaint/paint的原因。有没有一种方法可以通过不再次调用paint方法而只在paint方法所绘制的内容上添加一条线来绘制线,您不能调用
g.drawLine
并期望它永远留在面板上。这不是它的工作原理。(然后您必须在缓冲图像上绘制线条,并将图像绘制到面板上。)您不能保持代码不变,只需添加“绘制线条”。我提供的代码是最接近您的代码的解决方案。@aioobe@grassPro可以通过在paint method中设置一个条件来完成。paint method在OP需要时适用于
if
,在OP需要时适用于
else
<代码>绘制(Gra g){if(firstTime){//…}else{//…}}
这是个坏主意,因为第一次绘制组件时,它可能比实际设置大小、打包、最大化窗口时小得多,你可以命名它。。。然后提供的
图形
对象将有一个讨厌的剪辑集…@aioobe是的,这可能是一个坏主意,但是“讨厌的剪辑集”是什么意思?哪一行?最终从@aioobe的答案中得到了您的意图:-)顺便说一句,在按照建议阅读教程时,请不要跳过关于java命名约定的章节,学习它们并坚持它们