Membuat popup context menu di program Java
Membuat Popup (Context) Menu Di Program Java
Menu alternatif yang dapat digunakan selain regular menu adalah popup menu atau context menu. Popup menu dapat ditampilkan dimana saja di area layar (screen). Proses pembuatan popup menu tidak jauh berbeda dengan regular menu (baca artikel Contoh Program Java: Memformat Teks Menggunakan Menu) dengan pengecualian bahwa popup menu tidak memerlukan obyek menu bar (kelas JMenuBar).

Untuk membuat popup menu, Anda terlebih dahulu harus membuat obyek dari kelas JPopupMenu. Anda kemudian menambahkan submenu dari kelas JMenu atau item menu dari kelas JMenuItem, JRadioButtonMenuItem atau JCheckBoxMenuItem ke obyek tersebut. Berikut ini adalah hirarkhi turunan kelas JPopupMenu:

Hirarkhi turunan kelas JPopupMenu

Kelas JPopupMenu merupakan kelas turunan dari kelas JComponent. JPopupMenu mempunyai dua konstruktor dan banyak metoda. Berikut ini adalah konstruktor dan metoda kelas JPopupMenu yang sering digunakan:

Konstruktor Kelas JPopupMenu

Konstruktor Keterangan
JPopupMenu() Mengkonstruksi obyek popup menu.
JPopupMenu(String label) Mengkonstruksi obyek popup menu dengan label.

Metoda Kelas JPopupMenu

Metoda Keterangan
add(JMenuItem menuItem) Menambahkan obyek item menu ke dalam popup menu.
addSeparator() Menambahkan pembatas (separator) berupa garis horisontal antar menu.
show(Component invoker, int x, int y) Menampilkan popup menu di koordinat x dan y dari komponen dimana popup menu ditampilkan.

Contoh program berikut ini masih terkait pemformatan teks. Anda dapat menentukan apakah teks mempunyai penjajaran horisontal (horizontal alignment) kiri, tengah atau kanan, penjajaran vertikal (vertical alignment) bawah, tengah atau atas. Anda juga dapat menentukan warna teks dan warna latar (foreground dan background). Semua operasi pemformatan teks hanya dilakukan melalui popup menu. Berikut ini adalah contoh program dan hasil eksekusinya:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Nama file : DemoPopupMenu.java
// Pemformatan teks menggunakan popup menu

// Mengimpor kelas
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// Mendeklarasikan kelas
public class DemoPopupMenu extends JFrame {

   private JLabel label;
   private JPopupMenu popupMenu;
   private JRadioButtonMenuItem horAlign[], verAlign[], foreColor[], backColor[];
   private int horAlignValue[] = {SwingConstants.LEFT, SwingConstants.CENTER,
                                  SwingConstants.RIGHT};
   private int verAlignValue[] = {SwingConstants.TOP, SwingConstants.CENTER,
                                  SwingConstants.BOTTOM};
   private Color foreColorValue[] = {Color.BLACK, Color.BLUE, Color.RED};
   private Color backColorValue[] = {Color.YELLOW, Color.WHITE, Color.CYAN};
   private ButtonGroup groupHor, groupVer, groupFore, groupBack;

   // Konstruktor kelas
   public DemoPopupMenu() {
      label = new JLabel("Belajar Java", SwingConstants.CENTER);
      label.setForeground(Color.BLUE);
      label.setFont(new Font("Tahoma", Font.BOLD, 32));
      getContentPane().setBackground(Color.YELLOW);
      getContentPane().add(label, BorderLayout.CENTER);
      label.addMouseListener(
         new MouseAdapter() {
            public void mousePressed(MouseEvent me) {
               displayPopupMenu(me);
            }

            public void mouseReleased(MouseEvent me) {
               displayPopupMenu(me);
            }
         }
      );

      popupMenu = new JPopupMenu();
      RadioButtonHandler radioButtonHandler = new RadioButtonHandler();
      
      // Submenu dan item menu untuk penjajaran horisontal
      JMenu mnuHorAlign = new JMenu("Horizontal Alignment");
      mnuHorAlign.setMnemonic('H');
      popupMenu.add(mnuHorAlign);

      groupHor = new ButtonGroup();
      String horAlignName[] = {"Left", "Center", "Right"};
      horAlign = new JRadioButtonMenuItem[horAlignName.length];
      for (int x = 0; x < horAlign.length; x++) {
         horAlign[x] = new JRadioButtonMenuItem(horAlignName[x]);
         mnuHorAlign.add(horAlign[x]);
         groupHor.add(horAlign[x]);
         horAlign[x].addActionListener(radioButtonHandler);
      }

      horAlign[1].setSelected(true);

      // Submenu dan item menu untuk penjajaran vertikal
      JMenu mnuVerAlign = new JMenu("Vertical Alignment");
      mnuVerAlign.setMnemonic('V');
      popupMenu.add(mnuVerAlign);

      groupVer = new ButtonGroup();
      String verAlignName[] = {"Top", "Center", "Bottom"};
      verAlign = new JRadioButtonMenuItem[verAlignName.length];
      for (int x = 0; x < verAlign.length; x++) {
         verAlign[x] = new JRadioButtonMenuItem(verAlignName[x]);
         mnuVerAlign.add(verAlign[x]);
         groupVer.add(verAlign[x]);
         verAlign[x].addActionListener(radioButtonHandler);
      }

      verAlign[1].setSelected(true);
      popupMenu.addSeparator();

      //submenu dan item menu untuk foreground color
      JMenu mnuForeColor = new JMenu("Foreground color");
      mnuForeColor.setMnemonic('o');
      popupMenu.add(mnuForeColor);

      groupFore = new ButtonGroup();
      String foreColorName[] = {"Black", "Blue", "Red"};
      foreColor = new JRadioButtonMenuItem[foreColorName.length];
      for (int x = 0; x < foreColor.length; x++) {
         foreColor[x] = new JRadioButtonMenuItem(foreColorName[x]);
         mnuForeColor.add(foreColor[x]);
         groupFore.add(foreColor[x]);
         foreColor[x].addActionListener(radioButtonHandler);
      }

      foreColor[1].setSelected(true);

      //submenu dan item menu untuk background color
      JMenu mnuBackColor = new JMenu("Background color");
      mnuBackColor.setMnemonic('a');
      popupMenu.add(mnuBackColor);

      groupBack = new ButtonGroup();
      String backColorName[] = {"Yellow", "White", "Cyan"};
      backColor = new JRadioButtonMenuItem[backColorName.length];
      for (int x = 0; x < backColor.length; x++) {
         backColor[x] = new JRadioButtonMenuItem(backColorName[x]);
         mnuBackColor.add(backColor[x]);
         groupBack.add(backColor[x]);
         backColor[x].addActionListener(radioButtonHandler);
      }

      backColor[0].setSelected(true);
      popupMenu.addSeparator();

      
      // Item menu Exit
      JMenuItem mnuExit = new JMenuItem("Exit");
      mnuExit.setMnemonic('E');
      popupMenu.add(mnuExit);
      mnuExit.addActionListener(
         new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
               System.exit(0);
            }
         }
      );
   }

   // Metoda displayPopupMenu
   private void displayPopupMenu(MouseEvent me) {
      if (me.isPopupTrigger())
         popupMenu.show(me.getComponent(), me.getX(), me.getY());
   }

   // Inner class
   class RadioButtonHandler implements ActionListener {
      
      public void actionPerformed(ActionEvent ae) {
      
         for (int y = 0; y < horAlign.length; y++) {
            if (horAlign[y].isSelected()) {
               label.setHorizontalAlignment(horAlignValue[y]);
               break;
            }
         }

         for (int y = 0; y < verAlign.length; y++) {
            if (verAlign[y].isSelected()) {
               label.setVerticalAlignment(verAlignValue[y]);
               break;
            }
         }

         for (int y = 0; y < foreColor.length; y++) {
            if (foreColor[y].isSelected()) {
               label.setForeground(foreColorValue[y]);
               break;
            }
         }

         for (int y = 0; y < backColor.length; y++) {
            if (backColor[y].isSelected()) {
               getContentPane().setBackground(backColorValue[y]);
               break;
            }
         }
         
         repaint();
      }
   }

   // Metoda main
   public static void main(String[] args) {
      DemoPopupMenu frame = new DemoPopupMenu();
      frame.setTitle("Kelas DemoPopupMenu");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(360, 195);
      frame.setVisible(true);
   }
}

Membuat popup menu kelas JPopupMenu di Java

Pembuatan popup menu berbeda dengan regular menu. Regular menu dibuat dengan meletakkan menu pada menu bar, sedangkan popup menu dihubungkan dengan parent komponen. Untuk menampilkan popup menu, Anda menggunakan metoda show dari kelas JPopupMenu (pernyataan baris nomor 132).

Metoda show mempunyai tiga parameter. parameter pertama adalah komponen dimana popup menu ditampilkan (me.getComponent() mengacu ke obyek label), parameter kedua dan ketiga adalah koordinat kartesius dimana posisi popup menu ditampilkan.

Komponen dapat menampilkan popup menu dengan cara mengklik tombol mouse tertentu. Di sistem Windows, popup menu ditampilkan ketika tombol kanan mouse ditekan, sedangkan di Motif, popup menu ditampilkan ketika tombol mouse ketiga ditekan dan ditahan.

Komponen yang berkeinginan menampilkan popup menu harus mengimplementasikan interfes MouseListener dan mendeklarasikan ulang (overriding) metoda mousePressed dan mouseReleased yang mempunyai parameter kelas MouseEvent. Anda dapat menggunakan variabel yang mengacu ke obyek kelas MouseEvent (variabel acuan me) untuk menentukan komponen dan posisi tampilan popup menu