[java] jlist met popupmenu

Pagina: 1
Acties:

  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
Ik heb rechts in mijn scherm een JList, met een aantal items. Ik wil, dat als ik op een item met de rechtermuisknop klik, dat dan dat item geselecteerd word, en er een JPopupMenu tevoorschijn komt.
Ik heb het nu al voor elkaar dat ik in de JList een popupmenu heb;
maar als ik met de rechtermuisknop op een item klik, dan wordt hij niét eerst geselecteerd, maar komt er gewoon een popupmenu. Kan ik ervoor zorgen dat hij vòòrdat het popupmenu komt, éérst het item selecteerd?
code:
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
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;

class Channel implements ActionListener{
//Declaring Variables
public String channel;
private Client client;
private ListenSend listenSend;
public JTextArea msgField;
private JTextField msgSend;
private JList users;
private Vector name;
private JTabbedPane tabbedPane;

public Channel(){}

public Channel(String channel,Client client){

    ImageIcon icon = new ImageIcon("Images/open.gif");
    JPanel panel = new JPanel(new BorderLayout(3,3));
    panel.setBorder(BorderFactory.createLineBorder(panel.getBackground(), 5));
    msgField = new JTextArea();
    msgSend = new JTextField();
    panel.add(msgField, BorderLayout.CENTER);
    panel.add(msgSend, BorderLayout.SOUTH);
    client.tabbedPane.addTab(channel, icon, panel, "Channel: " +channel);
    name = new Vector();
    users = new JList(name);
    msgSend.addActionListener(this);
    msgField.setEditable(false);

//POPUP-Menu
    final JPopupMenu popup = new JPopupMenu();
    JMenuItem mi1 = new JMenuItem("Popup Item 1");
    JMenuItem mi2 = new JMenuItem("Popup Item 2");
    popup.add(mi1);
    popup.add(mi2);


    (users.addMouseListener(new MouseAdapter(){
       public void mousePressed(MouseEvent me){
        if (me.isPopupTrigger()) {
           popup.show(users, me.getX(), me.getY());
    users.get
        }
       }

       public void mouseReleased(MouseEvent me) {
        if (me.isPopupTrigger()) {
           popup.show(users, me.getX(), me.getY());
        }
       }
    }));
    //END POPUP
    panel.add(users, BorderLayout.EAST);


  this.client = client;
  this.listenSend = listenSend;
  this.channel = channel;
  this.tabbedPane = tabbedPane;
  users.setFixedCellWidth(100);

}


public String channelName(){
return channel;
}

public void names(StringTokenizer st){
  name.removeAllElements();
   while(st.hasMoreTokens()){
     name.add(st.nextToken());
   }
  users.updateUI();
  }


public void message(String message){
    msgField.append(message);
}

public void becomeOperator(){
//nog implementeren
}

public void updateGUI(){
this.updateGUI();
}


public void removeTab(){
//tabbedPane
}


 public void actionPerformed(ActionEvent e){
    client.listenSend.send("MSG»"+channel+"»"+msgSend.getText());
    msgSend.setText("");
    }



}

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Uhme.... Het selecte probleem staat los van de popup. De Swing JList selecteert volgens mij niets als je met rechts klikt. Als jij dat wel wilt kan je dat vrij eenvoudig zelf implementeren door het ListSelectionModel aan te passen vanuit een MouseListener :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
uhm :)
lijkt me een goed idee om dat te doen ja!
ik zou alleen niet weten hoe :P

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Zynth: ik zou alleen niet weten hoe :P
Ik zal een paar hints geven ;) .

Uit een MouseEvent kan je vast wel de locatie van de muis-klik halen. Met locationToIndex kan je uit een Point de index van de JList halen. Deze index kan je gebruiken om een item te selecteren. Dit kan direct via de JList of eventueel (netter) direct op het selectie-model.

Zo duidelijker?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
ja :P

ik kom er zo wel uit denk ik.
thnx!

  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
ik denk dat ik teveel denk :)
ik kom er namelijk toch niet helemaal uit.
Als de methodes die 'leuk' zijn om te gebruiken,
vereisen als input een mouseListener, en niet een mouseEvent.
code:
1
2
3
4
5
6
7
8
(users.addMouseListener(new MouseAdapter(){
       public void mousePressed(MouseEvent me){
//Hier moet dan eerst de goede "cel" van het JList worden
//geselecteerd.
        if (me.isPopupTrigger()) {
           popup.show(users, me.getX(), me.getY());
        }
       }

Kan je nòg specifieker zijn?? :)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
ey Zynth! jij bent vast niet bezig met de 'forum' opdracht ;) (ik ook :))

Kijk hier eens: http://java.sun.com/j2se/1.4/docs/api/javax/swing/JList.html#getCellBounds(int, int)

ik weet niet of het de makkelijkste manier is, maar met die methode kun je iig bepalen welk item aangeklikt is, zodat je em kunt selecteren.

[edit]
http://java.sun.com/j2se/1.4/docs/api/javax/swing/JList.html#locationToIndex(java.awt.Point)

die is iets handiger nog ;)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
code:
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
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class JListSelectionDemo {

    public static void main(String[] ps) {
      JList list = new JList(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"});
      list.addMouseListener(new Selector(list));

      JPanel panel = new JPanel(new GridLayout(1,1));
      panel.add(list);

      JFrame frame = new JFrame("JList demo");
      frame.setContentPane(panel);
      frame.pack();
      frame.show();
    }
}

class Selector extends MouseAdapter {
    private JList _list;

    public Selector(JList list) {
      super();
      _list = list;
    }

    public void mousePressed(MouseEvent e) {
      int index = _list.locationToIndex(e.getPoint());
      _list.setSelectedIndex(index);
    }
}

Moet het nog specifieker? :P ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
specifieker hoeft niet hoor! :P
ik heb het aan de gang gekregen.
(en het werkt heeeerlijk :))
Pagina: 1