【发布时间】:2017-02-13 10:54:09
【问题描述】:
我已经创建了 JFrame,将透明颜色(new Color(0, 0, 0, 0))设置为背景并将 JPanel 放置在上面。我已经覆盖了 JPanel 的 paintComponent 方法并在其上绘制了一些带有 alpha 通道的图像。当用户右键单击我的 JPanel 时,我也会显示弹出菜单。
我面临这样一个事实,即弹出菜单的图像在它应该消失后仍保留在 JFrame 上(刚才 JPanel 的图片覆盖了它)。据我了解,在绘制新框架之前不会清除 JFrame。
示例
public class MainWindow extends JFrame {
private MyPanel widget = new MyPanel();
private Action quitAction = new AbstractAction("Quit") {
@Override
public void actionPerformed(ActionEvent actionEvent) {
setVisible(false);
dispose();
}
};
private MainWindow() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setUndecorated(true);
setBackground(new Color(0, 0, 0, 0));
widget.loadImage("image.png");
setContentPane(widget);
pack();
setAlwaysOnTop(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(() -> {
MainWindow window = new MainWindow();
window.setVisible(true);
});
}
class MyPanel extends JPanel implements MouseListener {
BufferedImage image;
MyPanel() {
super();
addMouseListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintCompontent(g);
if (characterImage != null) {
g.drawImage(characterImage, 0, 0, this);
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
clickPos = e.getLocationOnScreen();
if (SwingUtilities.isRightMouseButton(e)) {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(quitAction);
popupMenu.show(this, e.getX(), e.getY());
}
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
boolean loadImage(String name) {
BufferedImage backupImage = image;
try {
image = ImageIO.read(MainWindow.class.getResourceAsStream("/images/" + name));
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
} catch (IOException ex) {
image = backupImage;
return false;
}
return true;
}
}
}
【问题讨论】:
-
您还忘记提供runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
-
我“猜想”你没有调用
super.paintComponent和/或你使用基于 alpha 的颜色来设置面板的背景 -
“据我了解,在绘制新框架之前不会清除 JFrame。” - 仅当您尊重绘制链并确保何时覆盖任何绘制方法时,您正在调用他们的超级方法(并且您不会尝试将基于 alpha 的颜色应用于不透明面板)
-
我添加了代码示例。不,我没有忘记调用父方法。
-
"...JFrame 在绘制之前没有被清除..." 你是对的。 “清除”通过 JFrame 再次调用paintBackground 进行。但是由于您的背景是半透明的,所以您的弹出菜单图形会留下