最近我一直在使用java和swing进行练习并且遇到了问题
我有一个"欢迎屏幕"随机生成一些背景。
我重写了paintComponent,并根据当前的JPanel分辨率绘制了背景。不仅仅是椭圆形的东西
但是当我使用菜单时,菜单的背景会重新粉刷。
椭圆的大小和底部基于屏幕分辨率。 有什么办法可以解决吗?
注意:欢迎面板是JPanel
答案 0 :(得分:1)
这是因为PopUpMenu下的区域在关闭popUp后重绘,但其他区域没有。
您可以在关闭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);
}
}
}
答案 1 :(得分:-1)
在位图上绘制背景,并使用paintComponent()
方法复制它。 paint事件可以“随时”发生,在这种情况下,随机源会生成新值。
另一种解决方案:创建一个方法getRandom()
,使用相同的种子创建一个Random
对象,然后使用它。例如:
protected long seed = 0L;
protected void initRandom() { // call this in constructing time
seed = Calendar.getInstance().getTimeInMillis();
}
protected Random getRandom() { // call this at the start of the painting method
return new Random(seed);
}
这将为所有窗口实例创建新种子,并始终如一地使用它。任何重画都不会产生不良影响。