gpt4 book ai didi

Java JMenuBar重画背景

转载 作者:太空宇宙 更新时间:2023-11-04 14:35:25 25 4
gpt4 key购买 nike

最近我一直在尝试 java 和 swing,但遇到了问题

我有一个“欢迎屏幕”,其中有一些随机生成的背景。

我重写了paintComponent并使其根据当前JPanel的分辨率绘制背景。不是花哨的东西,只是椭圆形

before

但是当我使用菜单时,菜单的背景被重新绘制。

after

椭圆形的大小和位置取决于屏幕分辨率。有什么办法解决吗?

注意:欢迎面板是 JPanel

最佳答案

发生这种情况是因为 PopUpMenu 下的区域在关闭 popUp 后重绘,但其他区域则不会。

您可以在关闭弹出窗口后重新绘制面板,如下所示:

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;


public class TestFrame extends JFrame {

public TestFrame() {
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void init() {
DrawPanel p = new DrawPanel();
add(p);

JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("menu");
JPopupMenu popupMenu = menu.getPopupMenu();
popupMenu.addPopupMenuListener(new PopupMenuListener() {

@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {

}

@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
repaint();
}

@Override
public void popupMenuCanceled(PopupMenuEvent arg0) {

}
});
bar.add(menu);
menu.add(new JMenuItem("item"));
setJMenuBar(bar);
}


public static void main(String args[]) {
new TestFrame();
}


private class DrawPanel extends JPanel{

@Override
public Dimension getPreferredSize() {
return new Dimension(100,100);
}

@Override
protected void paintComponent(Graphics arg0) {
super.paintComponent(arg0);

Random r = new Random();
int nextInt = r.nextInt(20);
arg0.drawOval(nextInt, nextInt, 20, 20);
}
}
}

关于Java JMenuBar重画背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com