给JFrame加入背景图和组件,为保证组件出现在背景图上方(可见),重写paint方法,先
绘制背景图,再调用各组件的构造方法。
但是在菜单项切换时遇到了问题。
如果先点击一个菜单JMenu,然后将鼠标(或用键盘左右键)移到另一个JMenu上时,无法重绘背景图代码如下(组件只保留了菜单, 背景图片为1.jpg)
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;public class Test extends JFrame
{
JMenuBar gameMenu;
JMenu game;
JMenu help;
public Test()
{
gameMenu = new JMenuBar();
game = new JMenu("游戏");
help = new JMenu("帮助");
game.add(new JMenuItem("1"));
game.add(new JMenuItem("2"));
help.add(new JMenuItem("3"));
help.add(new JMenuItem("4"));
setJMenuBar(gameMenu);
gameMenu.add(game);
gameMenu.add(help);
MyListener ml = new MyListener();
game.addMenuListener(ml);
help.addMenuListener(ml);
setPreferredSize(new Dimension(400, 200));
pack();
setVisible(true);
}
public void paint(Graphics g)
{
g.drawImage(getToolkit().getImage("1.jpg"), 0, 0, getSize().width, getSize().height, this);
gameMenu.repaint();
}
public static void main(String[] args)
{
new Test();
}
private class MyListener implements MenuListener
{
private boolean gameClick;
private boolean helpClick;
public void menuCanceled(MenuEvent e)
{
}
public void menuDeselected(MenuEvent e)
{
if (((JMenu)e.getSource()).equals(game))
{
gameClick = false;
}
else
{
helpClick = false;
}
//repaint();
gameMenu.repaint();
}
public void menuSelected(MenuEvent e)
{
if (((JMenu)e.getSource()).equals(game))
{
gameClick = true;
game.requestFocusInWindow();
game.doClick();
game.doClick();
}
else
{
helpClick = true;
help.doClick();
help.doClick();
help.requestFocusInWindow();
}
}
}
}
绘制背景图,再调用各组件的构造方法。
但是在菜单项切换时遇到了问题。
如果先点击一个菜单JMenu,然后将鼠标(或用键盘左右键)移到另一个JMenu上时,无法重绘背景图代码如下(组件只保留了菜单, 背景图片为1.jpg)
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;public class Test extends JFrame
{
JMenuBar gameMenu;
JMenu game;
JMenu help;
public Test()
{
gameMenu = new JMenuBar();
game = new JMenu("游戏");
help = new JMenu("帮助");
game.add(new JMenuItem("1"));
game.add(new JMenuItem("2"));
help.add(new JMenuItem("3"));
help.add(new JMenuItem("4"));
setJMenuBar(gameMenu);
gameMenu.add(game);
gameMenu.add(help);
MyListener ml = new MyListener();
game.addMenuListener(ml);
help.addMenuListener(ml);
setPreferredSize(new Dimension(400, 200));
pack();
setVisible(true);
}
public void paint(Graphics g)
{
g.drawImage(getToolkit().getImage("1.jpg"), 0, 0, getSize().width, getSize().height, this);
gameMenu.repaint();
}
public static void main(String[] args)
{
new Test();
}
private class MyListener implements MenuListener
{
private boolean gameClick;
private boolean helpClick;
public void menuCanceled(MenuEvent e)
{
}
public void menuDeselected(MenuEvent e)
{
if (((JMenu)e.getSource()).equals(game))
{
gameClick = false;
}
else
{
helpClick = false;
}
//repaint();
gameMenu.repaint();
}
public void menuSelected(MenuEvent e)
{
if (((JMenu)e.getSource()).equals(game))
{
gameClick = true;
game.requestFocusInWindow();
game.doClick();
game.doClick();
}
else
{
helpClick = true;
help.doClick();
help.doClick();
help.requestFocusInWindow();
}
}
}
}
解决方案 »
- 有没有类似highcharts那样可以做温度计和仪表盘图表的js插件
- 关于struts1.x中的html:messages标签的使用
- 菜鸟请教
- 高手请进 JDBC3.0的问题
- 请教
- 请问String s="asdf"等价与String s=new String("asdf")吗?区别究竟何在?最好用程序解答。
- 初学者的问题:用JAVA来实现一个最简单的数据库程序,该怎么做?
- 在jbuider5里面 怎么生成 .exe文件?做好的工程又该怎么打包?
- 送分了:)如何将一些需要输出的东西写到ByteArrayOutputStream输出流中,如一个二维数组String[][]。
- JAVA中类和接口
- 〓一个SWT界面线程的问题〓【88分】
- java能否快速开发单机版数据库(只实现增删改查基本功能)?有实例吗?谢谢帮助!
package testGUI;import java.awt.*;import javax.swing.*;
import javax.swing.event.*;public class Test extends JFrame {
JMenuBar gameMenu;
JMenu game;
JMenu help; public Test() {
gameMenu = new JMenuBar();
game = new JMenu("游戏");
help = new JMenu("帮助"); game.add(new JMenuItem("1"));
game.add(new JMenuItem("2")); help.add(new JMenuItem("3"));
help.add(new JMenuItem("4")); setJMenuBar(gameMenu);
gameMenu.add(game);
gameMenu.add(help); MyListener ml = new MyListener();
game.addMenuListener(ml);
help.addMenuListener(ml); this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
setSize(new Dimension(300,300));
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} private JPanel getCenterPanel() {
JPanel panel = new JPanel() {
private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g) {
g.drawImage(getToolkit().getImage("D:\\1.jpg"), 0,
0, getSize().width, getSize().height, this);
super.paintComponent(g);
}
};
panel.setOpaque(false);
return panel;
} public static void main(String[] args) {
new Test();
} private class MyListener implements MenuListener {
private boolean gameClick;
private boolean helpClick; public void menuCanceled(MenuEvent e) {
} public void menuDeselected(MenuEvent e) {
if (((JMenu) e.getSource()).equals(game)) {
gameClick = false;
} else {
helpClick = false;
}
} public void menuSelected(MenuEvent e) {
if (((JMenu) e.getSource()).equals(game)) {
gameClick = true;
game.requestFocusInWindow();
game.doClick();
game.doClick();
} else {
helpClick = true;
help.doClick();
help.doClick();
help.requestFocusInWindow();
}
}
}
}
仅可见菜单和背景图组件消失
如下例,一个JMenu中的JMenuItem数量超过2就会出现上述情况。import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;public class Test extends JFrame
{
JMenuBar gameMenu;
JPanel gamePanel;
JButton b = new JButton("test");
public Test()
{
gameMenu = new JMenuBar();
JMenu game = new JMenu("游戏");
JMenu help = new JMenu("帮助");
game.add(new JMenuItem("1"));
game.add(new JMenuItem("2"));
help.add(new JMenuItem("3"));
help.add(new JMenuItem("4"));
help.add(new JMenuItem("5"));//////////////////////////
setJMenuBar(gameMenu);
gameMenu.add(game);
gameMenu.add(help);
gamePanel = new JPanel()
{
private static final long serialVersionUID = 1234567890123456789L;
public void paint(Graphics g)
{
g.drawImage(getToolkit().getImage("1.jpg"), 0, 0, getSize().width, getSize().height, this);
gameMenu.repaint();
b.repaint();
}
};
gamePanel.setLayout(new BorderLayout(10, 10));
gamePanel.setPreferredSize(new Dimension(400, 200));
gamePanel.add(b);
gamePanel.add(new MyPanel(), BorderLayout.EAST);
gamePanel.add(new MyPanel(), BorderLayout.WEST);
gamePanel.add(new MyPanel(), BorderLayout.SOUTH);
gamePanel.add(new MyPanel(), BorderLayout.NORTH);
getContentPane().add(gamePanel);
pack();
setVisible(true);
}
class MyPanel extends JPanel
{
public MyPanel()
{
setPreferredSize(new Dimension(40, 40));
setBackground(Color.BLUE);
setOpaque(false);
}
}
public static void main(String[] args)
{
new Test();
}
}
import javax.swing.event.*;public class Test extends JFrame {
JMenuBar gameMenu;
JMenu game;
JMenu help;
JButton b = new JButton("test");
public Test() {
gameMenu = new JMenuBar();
game = new JMenu("游戏");
help = new JMenu("帮助"); game.add(new JMenuItem("1"));
game.add(new JMenuItem("2")); help.add(new JMenuItem("3"));
help.add(new JMenuItem("4")); setJMenuBar(gameMenu);
gameMenu.add(game);
gameMenu.add(help); MyListener ml = new MyListener();
game.addMenuListener(ml);
help.addMenuListener(ml); this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
setSize(new Dimension(300,300));
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} private JPanel getCenterPanel() {
JPanel panel = new JPanel() {
private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g) {
g.drawImage(getToolkit().getImage("1.jpg"), 0,
0, getSize().width, getSize().height, this);
super.paintComponent(g);
}
};
panel.setOpaque(false);
b.setPreferredSize(new Dimension(300,200));
panel.add(b);
return panel;
} public static void main(String[] args) {
new Test();
} private class MyListener implements MenuListener {
private boolean gameClick;
private boolean helpClick; public void menuCanceled(MenuEvent e) {
} public void menuDeselected(MenuEvent e) {
if (((JMenu) e.getSource()).equals(game)) {
gameClick = false;
} else {
helpClick = false;
}
} public void menuSelected(MenuEvent e) {
if (((JMenu) e.getSource()).equals(game)) {
gameClick = true;
game.requestFocusInWindow();
game.doClick();
game.doClick();
} else {
helpClick = true;
help.doClick();
help.doClick();
help.requestFocusInWindow();
}
}
}
}