这里直接给出图片,有图有真相嘛。
然后直接给出代码
基本思想还是事件监听和响应,使用了MouseListener,但是最关键的还是布局Layout的灵活使用。如果需要添加更多的菜单,布局的还需要修改!(这个方法实现起来不方便,因为组合情况太多,不容易添加新的按钮,不是非常推荐,可以看我的这篇文章《利用简单的自由布局实现实现下来列表式菜单》)
import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.Border; import javax.swing.border.LineBorder; public class Menulist extends JFrame implements MouseListener { private static final long serialVersionUID = -6050868817749702480L; /** * @param args */ private JButton menulistButton1; private JLabel menulistButton1_1; private JLabel menulistButton1_2; private JLabel menulistButton1_3; private JButton menulistButton2; private JLabel menulistButton2_1; private JLabel menulistButton2_2; private JLabel menulistButton2_3; private JButton menulistButton3; private JLabel menulistButton3_1; private JLabel menulistButton3_2; private JLabel menulistButton3_3; private JPanel mainPanel; private JPanel buttonPanel1; private JPanel buttonPanel2; private JPanel buttonPanel3; public Menulist(String title) { super(title); setDefaultCloseOperation(EXIT_ON_CLOSE); mainPanel = new JPanel(); setLayout(new GridLayout(1, 1)); add(mainPanel); mainPanel.setLayout(new GridBagLayout()); buttonPanel1 = new JPanel(); GridBagConstraints GBC = new GridBagConstraints(); GBC.gridx = 0; GBC.gridy = 0; GBC.fill = GridBagConstraints.BOTH; mainPanel.add(buttonPanel1, GBC); buttonPanel2 = new JPanel(); GBC.gridx = 0; GBC.gridy = 1; mainPanel.add(buttonPanel2, GBC); buttonPanel3 = new JPanel(); GBC.gridx = 0; GBC.gridy = 2; mainPanel.add(buttonPanel3, GBC); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); menulistButton1 = new JButton("menulist1_0"); menulistButton1_1 = new JLabel("menulist1_1"); menulistButton1_2 = new JLabel("menulist1_2"); menulistButton1_3 = new JLabel("menulist1_3"); menulistButton2 = new JButton("menulist2_0"); menulistButton2_1 = new JLabel("menulist2_1"); menulistButton2_2 = new JLabel("menulist2_2"); menulistButton2_3 = new JLabel("menulist2_3"); menulistButton3 = new JButton("menulist3_0"); menulistButton3_1 = new JLabel("menulist3_1"); menulistButton3_2 = new JLabel("menulist3_2"); menulistButton3_3 = new JLabel("menulist3_3"); buttonPanel1.add(menulistButton1); buttonPanel2.add(menulistButton2); buttonPanel3.add(menulistButton3); menulistButton1_1.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton1_2.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton1_3.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton2_1.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton2_2.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton2_3.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton3_1.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton3_2.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton3_3.setHorizontalAlignment((int) CENTER_ALIGNMENT); menulistButton1.addMouseListener(this); menulistButton2.addMouseListener(this); menulistButton3.addMouseListener(this); menulistButton1_1.addMouseListener(this); menulistButton1_2.addMouseListener(this); menulistButton1_3.addMouseListener(this); menulistButton2_1.addMouseListener(this); menulistButton2_2.addMouseListener(this); menulistButton2_3.addMouseListener(this); menulistButton3_1.addMouseListener(this); menulistButton3_2.addMouseListener(this); menulistButton3_3.addMouseListener(this); pack(); } public static void main(String[] args) { // TODO Auto-generated method stub java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Menulist("menulistList - Ben Zeph").setVisible(true); } }); } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if (menulistButton1.equals(e.getSource())) { if (!menulistButton1_1.isValid()// 000 && !menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel1.add(menulistButton1); buttonPanel1.add(menulistButton1_1); buttonPanel1.add(menulistButton1_2); buttonPanel1.add(menulistButton1_3); } else if (!menulistButton1_1.isValid()// 001 && !menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel1.add(menulistButton1); buttonPanel1.add(menulistButton1_1); buttonPanel1.add(menulistButton1_2); buttonPanel1.add(menulistButton1_3); } else if (!menulistButton1_1.isValid()// 010 && menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(4, 1)); buttonPanel1.add(menulistButton1); buttonPanel1.add(menulistButton1_1); buttonPanel1.add(menulistButton1_2); buttonPanel1.add(menulistButton1_3); } else if (!menulistButton1_1.isValid()// 011 && menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(4, 1)); buttonPanel1.add(menulistButton1); buttonPanel1.add(menulistButton1_1); buttonPanel1.add(menulistButton1_2); buttonPanel1.add(menulistButton1_3); } else if (menulistButton1_1.isValid()// 100 && !menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); buttonPanel1.add(menulistButton1); } else if (menulistButton1_1.isValid()// 101 && !menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); buttonPanel1.add(menulistButton1); } else if (menulistButton1_1.isValid()// 110 && menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel1.add(menulistButton1); } else if (menulistButton1_1.isValid()// 111 && menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel1.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel1.add(menulistButton1); } buttonPanel1.repaint(); buttonPanel1.updateUI(); } else if (menulistButton2.equals(e.getSource())) { if (!menulistButton1_1.isValid()// 000 && !menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel2.add(menulistButton2); buttonPanel2.add(menulistButton2_1); buttonPanel2.add(menulistButton2_2); buttonPanel2.add(menulistButton2_3); } else if (!menulistButton1_1.isValid()// 001 && !menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel2.add(menulistButton2); buttonPanel2.add(menulistButton2_1); buttonPanel2.add(menulistButton2_2); buttonPanel2.add(menulistButton2_3); } else if (!menulistButton1_1.isValid()// 010 && menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); buttonPanel2.add(menulistButton2); } else if (!menulistButton1_1.isValid()// 011 && menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(1, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); buttonPanel2.add(menulistButton2); } else if (menulistButton1_1.isValid()// 100 && !menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(4, 1)); buttonPanel2.add(menulistButton2); buttonPanel2.add(menulistButton2_1); buttonPanel2.add(menulistButton2_2); buttonPanel2.add(menulistButton2_3); } else if (menulistButton1_1.isValid()// 101 && !menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(4, 1)); buttonPanel2.add(menulistButton2); buttonPanel2.add(menulistButton2_1); buttonPanel2.add(menulistButton2_2); buttonPanel2.add(menulistButton2_3); } else if (menulistButton1_1.isValid()// 110 && menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel2.add(menulistButton2); } else if (menulistButton1_1.isValid()// 111 && menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel2.removeAll(); buttonPanel1.setLayout(new GridLayout(4, 1)); buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel2.add(menulistButton2); } buttonPanel2.repaint(); buttonPanel2.updateUI(); } else if (menulistButton3.equals(e.getSource())) { if (!menulistButton1_1.isValid()// 000 && !menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(1, 1)); // buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); buttonPanel3.add(menulistButton3); buttonPanel3.add(menulistButton3_1); buttonPanel3.add(menulistButton3_2); buttonPanel3.add(menulistButton3_3); } else if (!menulistButton1_1.isValid()// 001 && !menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(1, 1)); // buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(10, 1)); buttonPanel3.add(menulistButton3); } else if (!menulistButton1_1.isValid()// 010 && menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(1, 1)); // buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel3.add(menulistButton3); buttonPanel3.add(menulistButton3_1); buttonPanel3.add(menulistButton3_2); buttonPanel3.add(menulistButton3_3); } else if (!menulistButton1_1.isValid()// 011 && menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(1, 1)); // buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel3.add(menulistButton3); } else if (menulistButton1_1.isValid()// 100 && !menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(4, 1)); // buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel3.add(menulistButton3); buttonPanel3.add(menulistButton3_1); buttonPanel3.add(menulistButton3_2); buttonPanel3.add(menulistButton3_3); } else if (menulistButton1_1.isValid()// 101 && !menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(4, 1)); // buttonPanel2.setLayout(new GridLayout(1, 1)); buttonPanel3.setLayout(new GridLayout(7, 1)); buttonPanel3.add(menulistButton3); } else if (menulistButton1_1.isValid()// 110 && menulistButton2_1.isValid() && !menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(4, 1)); // buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(4, 1)); buttonPanel3.add(menulistButton3); buttonPanel3.add(menulistButton3_1); buttonPanel3.add(menulistButton3_2); buttonPanel3.add(menulistButton3_3); } else if (menulistButton1_1.isValid()// 111 && menulistButton2_1.isValid() && menulistButton3_1.isValid()) { buttonPanel3.removeAll(); // buttonPanel1.setLayout(new GridLayout(4, 1)); // buttonPanel2.setLayout(new GridLayout(4, 1)); buttonPanel3.setLayout(new GridLayout(4, 1)); buttonPanel3.add(menulistButton3); } buttonPanel3.repaint(); buttonPanel3.updateUI(); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub if (menulistButton1_1.equals(e.getSource())) { menulistButton1_1.setBorder(new LineBorder(Color.BLACK)); menulistButton1_1.setBackground(Color.green); } else if (menulistButton1_2.equals(e.getSource())) { menulistButton1_2.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton1_3.equals(e.getSource())) { menulistButton1_3.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton2_1.equals(e.getSource())) { menulistButton2_1.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton2_2.equals(e.getSource())) { menulistButton2_2.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton2_3.equals(e.getSource())) { menulistButton2_3.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton3_1.equals(e.getSource())) { menulistButton3_1.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton3_2.equals(e.getSource())) { menulistButton3_2.setBorder(new LineBorder(Color.BLACK)); } else if (menulistButton3_3.equals(e.getSource())) { menulistButton3_3.setBorder(new LineBorder(Color.BLACK)); } } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub if (menulistButton1_1.equals(e.getSource())) { menulistButton1_1.setBorder(null); } else if (menulistButton1_2.equals(e.getSource())) { menulistButton1_2.setBorder(null); } else if (menulistButton1_3.equals(e.getSource())) { menulistButton1_3.setBorder(null); } else if (menulistButton2_1.equals(e.getSource())) { menulistButton2_1.setBorder(null); } else if (menulistButton2_2.equals(e.getSource())) { menulistButton2_2.setBorder(null); } else if (menulistButton2_3.equals(e.getSource())) { menulistButton2_3.setBorder(null); } else if (menulistButton3_1.equals(e.getSource())) { menulistButton3_1.setBorder(null); } else if (menulistButton3_2.equals(e.getSource())) { menulistButton3_2.setBorder(null); } else if (menulistButton3_3.equals(e.getSource())) { menulistButton3_3.setBorder(null); } } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } }