06. marts 2003 - 00:13Der er
11 kommentarer og 2 løsninger
Højreklik på JList, how to?
Jeg har en JList (firmaJList)som er lavet dynamisk ved hjælp af DefaultListModel. Jeg vil gerne have at man ved et at højre klikke på et firma i firmaJlist får mulighed for at slette elementet. Lad os bare sige at den i første omgang skal lave en system.out.println("blabla"); og mulighed man vælger hedder ved højre klikket hedder "dosprintln". Hvordan gør jeg det når jeg i forvejen har en MouseListener som udskriver værdier fra de objekter der ligger i defaultlistmodel (jlist) ved venstre klik?
Her er et udpluk af min kode:
final DefaultListModel model = new DefaultListModel();
Firma currentFirma = null; for(int i=0;i<firmaListe.size();i++) { currentFirma=(Firma)firmaListe.get(i); model.addElement(currentFirma); }
jListFirma = new javax.swing.JList(model); jListOms = new javax.swing.JList(tempListe.toArray()); jListFirma.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if( event.getClickCount() == 1 ) { int index = jListFirma.getSelectedIndex(); if( index > -1 ) { firma = (Firma)jListFirma.getModel().getElementAt(index); tFLand.setText(firma.getLand()); tFAdr1.setText(firma.getAdresse1()); tFAdr2.setText(firma.getAdresse2()); tFAdr3.setText(firma.getAdresse3()); tFTlf.setText(firma.getTlf()); tFFax.setText(firma.getFax()); tFEmail.setText(firma.getEmail()); jTAFNoter.setText(firma.getNoter()); edit(false); } } } });
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
public TestFrame() { super("Test"); setSize(400,400);
liste = new ArrayList(); liste.add(new Element("Element1")); liste.add(new Element("Element2")); liste.add(new Element("Element3")); liste.add(new Element("Element4")); liste.add(new Element("Element5")); liste.add(new Element("Element6")); liste.add(new Element("Element7")); liste.add(new Element("Element8"));
model = new DefaultListModel(); for( int i = 0; i < liste.size(); i++ ) { model.addElement(liste.get(i)); } guiListe = new JList(model); guiListe.addMouseListener(new PopupListener());
popup = new JPopupMenu(); JMenuItem showItem = new JMenuItem("Vis"); showItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { showItem(); } }); JMenuItem deleteItem = new JMenuItem("Slet"); deleteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { deleteItem(); } }); popup.add(showItem); popup.add(deleteItem);
private void showItem() { Element element = (Element)model.get(guiListe.getSelectedIndex()); JOptionPane.showMessageDialog(this, element.getNavn()); } private void deleteItem() { int index = guiListe.getSelectedIndex(); model.remove(index); liste.remove(index); }
private class PopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { maybeShowPopup(e); }
public void mouseReleased(MouseEvent e) { maybeShowPopup(e); }
public void mouseClicked(MouseEvent e) { maybeShowPopup(e); }
public void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { Point point = new Point(e.getX(), e.getY()); int index = guiListe.locationToIndex(point); if( index > -1 ) { guiListe.setSelectedIndex(guiListe.locationToIndex(point)); popup.show(e.getComponent(), e.getX(), e.getY()); } } } }
private class Element implements Serializable {
private String navn;
public Element(String navn) { this.navn = navn; }
public String getNavn() { return navn; } public void setNavn(String navn) { this.navn = navn; } public String toString() { return navn; } } }
class Go { public static void main(String[] args) { new TestFrame().show(); } }
public class Mus extends MouseAdapter { public void mouseClicked(MouseEvent event) { if(event.isMetaDown()) { int index = list.locationToIndex(event.getPoint()); list.setSelectedIndex(index); JOptionPane.showMessageDialog(null, "Tillykke - du har lige højre-klikket på " + list.getSelectedValue(), "Højreklik", JOptionPane.INFORMATION_MESSAGE); }
if (event.getClickCount() == 2) { JOptionPane.showMessageDialog(null, "Tillykke - du har lige dobbelt-klikket på " + list.getSelectedValue(), "Højreklik", JOptionPane.INFORMATION_MESSAGE); } } }
public static void main(String args[]) { TestList testList = new TestList(); testList.setVisible(true); } }
Jeg kan desværre ikke se viths og codemons svar :o( Men mon ikke exp får databasen op på et tidspunkt...
--> ng-km Hvordan vil dit eksempel se ud hvis man skulle have muligheden for at vælge mellem ting ved højre klik. Min jListe består af firmaer, derfor vil jeg gerne have valget mellem at kunne slette og tilføje et firma når man højre klikker. Når man så har valgt det fremkommer så noget i stil med din tillykkeboks.
Jeg er ikke helt sikker på hvad du mener, men du kan jo bare lave en dialog der er tilpasset dit behov istedet for JOptionPane-boxen. Du får jo firmaets placering i Array/Vector givet når du trykker på det i JListen, og så kan du gøre med det hvad du vil. HVis du vil slette, så sletter du bare objektet i Arrayet/Vectoren på index-pladsen, hvis du vil tilføje, så åbner du og udfylder en dialog og indsætter det nye objekt på index-pladsen.
Mit eksempel er fra dengang jeg selv eksperimenterede med forskellige Swing-ting, og du får via mit eksempel vist placeringen af det valgte, men ud over det kan jeg ikke fortælle hvad du skal gøre med objektet, det er jo noget du bestemmer. Har du prøvet at køre koden, så ser du at du får objektet vist i JOptionPane-boxen.
Hehe, nej så har du ikke ligefrem store chancer for at se selv spørgsmålet ng-km. Mit problem er at jeg har en gui klasse som indeholder 3 jlister som er bygget ud fra 3 arraylist. Jeg vil gerne have det sådan at når jeg så højreklikker på et element i en af jlisterne så får jeg 3 muligheder: muligheden for at redigere eller slette elementet, eller muligheden for at tilføje et helt nyt element til listen. Hvis jeg så vælger tilføj skal et lille vindue poppe op så man kan indtaste de fornødne parametre. Man kunne jo fx godt lave tilføjelsestingen i en JDialog klasse for sig selv, men jeg skal jo have tilføje til nogle elementer som ligger i en anden klasse (min gui klasse). Jeg havde egentlig håbneet på at man kunne lave noget smart som fx joptionpane, hvor der så bare var mulighed for at indtaste. Altså at der var mulighed for at blive i selve gui klassen. Hvordan løser jeg denne problematik mest hensigtsmæssigt?
Okey jeg kunne jo prøve en JDialog i stil med: private JDialog d = null; public void showSubMenuDialog() { if (d == null) { d = new JDialog(frame, \"Title as usual\", true); // Modal vindue på frame JButton b = new JButton(\"Close\"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { closeSubMenuDialog(); } }); d.getContentPane().add(b); d.pack(); } d.setVisible(true); }
private void closeSubMenuDialog() { if (d != null) d.setVisible(false); } (fra http://www.eksperten.dk/spm/130202) Jeg tjekker det lige. Men hvordan får jeg mulighederne før at slette, redigere eller tilføjge ved højreklik på et element i jlisten?
Jeg kan ikke se problemet(forstår det ihvertfald ikke). Når du har højreklikket har du jo stort set objektet "i hånden", så kan du gøre med det hvad du vil.
Til at vælge hvad der skal ske kan du bruge en JPopupMenu, og en JOptionPane kan laves så der kan indtastes data til et nyt objekt hvis det er det brugeren vælger.
Jeg brugte en JDialog således at der kunne indtastes nyt data. Det virker fjong :o) Jeg vil lige kigge lidt på det med højre klikket så - jeg vil gerne have mig en menu, dropdown eller hvad sådan noget hedder. Altså ligesom hvis man hvis man højreklikker på skrivebordet eller andet steds. Hvad hedder sådan en menu?
Det min problematik gik ud på var bare, at jeg troede jeg var nød til at oprette en ny klasse for at få muligheden for at indtaste de fornødne data til et nyt objekt. Jeg mente så det var lidt tåbeligt at skulle sende data fra den gamle klasse til den nye klasse og tilbage igen når man var færdig med at indtaste(oprette nye objekter). Er det iøvrigt muligt bare at lave en reference fra klasse A til en klasse B, således at man fra B kan rette i A's data(fx tilføje objekter til en arraylist)?
Jeg vil egentlig gerne give pointene ny, men da man ikke kan se vith's og codemons svar, så venter jeg lige til det er muligt. Exp må da snart være færdige med opdateringen af deres db.
Okey jeg ved ikke lige hvad jeg tænker på... jeg sender selvfølgelig bare objektet A med over i B. Pinligt pinligt... det er jo ligesom et objekt orienteret programeringssprog... nevermind spg. 2...
Jeg har nu fået det til at virke, tak for hjælpen :o) Lige et sidste spørgsmål: Jeg vil gerne have det sådan når jeg højreklikker inde i jlisten så skal den vælge et element hvis der er et. Altså hvis fx jlisten ikke er fyldt ud og man trykker for nede (hvor der ingen elementer er) så skal den vælge det nederste element. Hvordan gør man det?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.