我提交了错误的下面(可能需要AA几天成为认可虽然): http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043319
更多的细节:
- 它适用于Windows Sun JDK 1.6版本13和17
- 它在Ubuntu 11.04 x64上同时出现OpenJDK 1.6.0_22和Sun JDK 1.6 .0_24
我想要的是,以与在它上面的附加面板的背景图像板(带额外的组件 - 例如JButtons,自定义形状等 - 在他们中),并绘制所有正确的。我在我的应用中使用JLayeredPane来达到这个目的,但为了举例,下面的代码应该足够了。无论下面的问题,我都乐于提供有关如何做我想做的事情的建议。
我遇到了这个问题,这幅画的行为真的很奇怪。它不会完全重新绘制(例如,只有图像上方的顶部),它会重新绘制 - 从我注意到间隔越来越大的步骤(例如,第1层油漆,第3层油漆,第9层油漆,第21层油漆,第64层油漆等)。 )。我的猜测是我在这里执行得太多 - 下面有什么明显的错误吗?
在单独的注释中,下面有三条注释行。有趣的是,取消注释其中的任何一个并评论以下行可解决问题。这些图像是具有以下属性(这似乎并不重要,其图像 - 只是大小):
cat.jpg JPEG 640x533 640x533+0+0 8-bit DirectClass 110KB 0.000u 0:00.000
cat-small.jpg JPEG 200x167 200x167+0+0 8-bit DirectClass 7.99KB 0.000u 0:00.000
这里是我遇到问题的Java代码:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class SwingDrawingPrb {
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
final JFrame frame = new JFrame("SwingDrawingPrb");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Container contentPane = frame.getContentPane();
frame.setLocation(550, 50);
frame.setSize(1000, 800);
frame.setVisible(true);
// ImageIcon image = new ImageIcon(SwingDrawingPrb.class.getResource("/cat-small.jpg"));
ImageIcon image = new ImageIcon(SwingDrawingPrb.class.getResource("/cat.jpg"));
final JPanel imagePanel = new JPanel() {
// Color trans = new Color(255, 0, 0, 255);
Color trans = new Color(255, 0, 0, 64);
protected void paintComponent(Graphics g) {
System.out.println("painting");
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(trans);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.blue);
g.drawLine(0, 0, 1000, 1000);
}
};
imagePanel.setBounds(0, 0, image.getIconWidth() + 200, image.getIconHeight() + 200);
imagePanel.setLayout(null);
// JLabel imageLabel = new JLabel("Hello, world!");
JLabel imageLabel = new JLabel(image);
imageLabel.setBounds(100, 100, image.getIconWidth(), image.getIconHeight());
imageLabel.addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
System.out.println("mouseMoved");
imagePanel.repaint();
}
});
imagePanel.add(imageLabel);
contentPane.add(imagePanel);
}
}
试过已经camickr,不起作用。实际上,尝试了很多不起作用的东西:)正如你所看到的,我正在用Color.white做一个fillRect,所以它始终不会变得“变暗”。它只是没有绘制所有的问题。它绘制一部分(几乎总是图像上方的一部分,但有时可能会看到其他效果)。如果你有一分钟,尝试运行它 - 你会明白我的意思。 – 2011-05-09 02:11:53
还有一件事 - 有时(但并非总是 - 这是我不明白的另一件事),在启动时画框被正确绘制 - 即在透明的红色东北方向的蓝色线上的猫的图像矩形,就像它应该的那样。现在在任何其他重新绘制 - 要么因为我手动调用鼠标移动repaint或因为我调整窗口大小 - 重新绘制严重。 – 2011-05-09 02:23:17
我错过了你先用WHITE填充背景。我其实根本没有注意到任何绘画问题。背景是浅红色,带有蓝色对角线,图像涂在对角线上。我在XP上使用JDK6.7。也许你有版本或平台问题。 – camickr 2011-05-09 02:28:04