【问题标题】:Why isn't the panel painted?为什么面板不上漆?
【发布时间】:2011-12-12 09:18:01
【问题描述】:

代码

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

我得到一个完全红色的面板。为什么我不接电话?我怎样才能得到它?

【问题讨论】:

  • 哪一行?最终从@aioobe 的回答中得到了你的意图:-) 顺便说一句,在按照建议阅读教程时,请不要跳过关于 java 命名约定的章节,学习它们并坚持使用它们

标签: java swing colors java-2d paintcomponent


【解决方案1】:

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

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

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

这不是这样做的方法。你为什么打电话给paintImmediately?这是文档中的内容:

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

很少需要调用此方法。在大多数情况下,它更多 调用 repaint 是有效的,它推迟了实际的绘制并且可以 将多余的请求折叠到单个绘制调用中。这种方法是 如果需要在当前事件发生时更新显示,这很有用 正在发送。

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

【讨论】:

  • @aioobe 谢谢。实际上我想保持一切不变,只添加一条线。这就是我想不再调用 repaint/paint 的原因。有没有一种方法可以通过不再调用 paint 方法来绘制线条,而只是在什么上添加一条线已经用paint方法绘制了
  • 不,你不能打电话给g.drawLine 并期望它永远留在面板上。这不是它的工作原理。 (然后你必须在一些缓冲图像上绘制线条,并将图像绘制到面板上。)你不能保持你的代码相同,只需添加一个“绘制线”。我提供的代码是最接近您的代码的解决方案。
  • @aioobe @grassPro 这可以通过在paint方法中设置一个条件来完成。Paint方法适用于if直到OP想要并且当OP想要时适用于elsepaint(Gra g) { if(firstTime) {//...} else {//...} }
  • 那是个坏主意,因为第一次绘制组件时,它可能比您实际设置它的大小时要小得多,打包它,最大化窗口,你命名它......然后提供的Graphics 对象将有一个讨厌的剪辑集...
  • @aioobe 是的,可能是个坏主意,但“讨厌的剪辑集”是什么意思?
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多