Avatar billede mungojerrie Nybegynder
29. juni 2004 - 12:55 Der er 4 kommentarer og
1 løsning

Lim mellem klasser

Hejsa

Jeg er ved at lave en højrekliksmenu/contextmenu som kan udføre et par handlinger for mig, men jeg har lidt svært ved at "lime" mine klasser sammen til formålet.

Jeg har en JTable klasse som indeholder mine data og hvorpå jeg har tilføjet min JPopupMenu, hvorfra jeg kan udføre mine handlinger.

Problemet opstår når jeg på min JPopupMenu klasse skal udfylde mine actionPerformed.

Er der nogen der kan levere noget "lim" til formålet ?

JTable - klasse

import java.awt.Color;

import javax.swing.JTable;
import javax.swing.table.TableModel;
import javax.swing.ListSelectionModel;
import java.awt.Dimension;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import GUI;
import PopupMenu;

public class CustomerTable extends JTable {
   
    private JTable table = null;
    private PopupMenu popupmenu = null;
   
    public CustomerTable(TableModel tm){
        super(tm);
        table = this;
       
        getTableHeader().setReorderingAllowed(false);
        setDragEnabled(false);
        setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        setShowHorizontalLines(true);
        setGridColor(Color.lightGray);
        setShowVerticalLines(false);
        configureEnclosingScrollPane();
        setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 11));
        setColumnSelectionAllowed(false);
        setRowSelectionAllowed(true);
        setCellSelectionEnabled(true);
        setPreferredScrollableViewportSize(new Dimension(600, 400));
        setIntercellSpacing(new Dimension(2, 2));
        setRowHeight(15);
        setShowHorizontalLines(true);
        setShowVerticalLines(true);
       
        //tilføj menu
        this.setPopupmenu(GUI.getCustomerSMSContextMenu());
        getPopupmenu().createPopupMenu(this);
       
        addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){
                    int selectedCol = getSelectedColumn();
                    int selectedRow = getSelectedRow();
                   
                    if (selectedCol == -1 || selectedRow == -1) return;
                    if(e.getModifiers() == InputEvent.BUTTON3_MASK){
                    }
                }
        });   
       
       
        addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                    int selectedCol = getSelectedColumn();
                    int selectedRow = getSelectedRow();
                   
                    if (selectedCol == -1 || selectedRow == -1) return;
                    if(e.getModifiers() == InputEvent.BUTTON3_MASK){
                        //hvis der klikkes på kolonnen med telfonnr
                        if(selectedCol == 0){
                            getPopupmenu().getSearch().setEnabled(true);
                            getPopupmenu().getSendsingle().setEnabled(true);
                        }else{
                            getPopupmenu().getSearch().setEnabled(false);
                            getPopupmenu().getSendsingle().setEnabled(false);
                        }
                    }
                }
        });   
    }
   
    /**
    * @return
    */
    public PopupMenu getPopupmenu() {
        return popupmenu;
    }

    /**
    * @param menu
    */
    public void setPopupmenu(PopupMenu menu) {
        popupmenu = menu;
    }

}



JPopupMenu - klasse

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseListener;

import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class PopupMenu extends JPopupMenu implements ActionListener, ItemListener {

    private JMenuItem search = new JMenuItem();
    private JMenuItem sendmulti = new JMenuItem();
    private JMenuItem sendsingle = new JMenuItem();
    private JMenuItem showdetail = new JMenuItem();

    public void createPopupMenu(JComponent c) {
        //Create the popup menu.
        JPopupMenu popup = new JPopupMenu();
       
        search.setText("Vis historik");
        search.addActionListener(this);
        search.setEnabled(false);
        popup.add(search);
       
        sendmulti.setText("Send multibesked");
        sendmulti.addActionListener(this);
        sendmulti.setEnabled(false);
        popup.add(sendmulti);
       
        sendsingle.setText("Send besked");
        sendsingle.addActionListener(this);
        sendsingle.setEnabled(false);
        popup.add(sendsingle);
       
        showdetail.setText("Vis detaljer / tilføj til arkiv");
        showdetail.addActionListener(this);
        showdetail.setEnabled(false);
        popup.add(showdetail);
   
        //Add listener to the text area so the popup menu can come up.
        MouseListener popupListener = new PopupMenuListener(popup);
        c.addMouseListener(popupListener);
    }

    public void actionPerformed(ActionEvent e) {
            JMenuItem source = (JMenuItem)(e.getSource());
            if(source.getLabel() == "Vis historik"){
               
                //Her mangler jeg adgang til min JTable
               
            }
            if(source.getLabel() == "Send multibesked"){
                   
            }
            if(source.getLabel() == "Send besked"){
                                   
            }
            if(source.getLabel() == "Vis detaljer / tilføj til arkiv"){
                   
            }
    }
   
    public void itemStateChanged(ItemEvent e) {
        JMenuItem source = (JMenuItem)(e.getSource());
    }


    /**
    * @return
    */
    public JMenuItem getSearch() {
        return search;
    }

    /**
    * @return
    */
    public JMenuItem getSendmulti() {
        return sendmulti;
    }

    /**
    * @return
    */
    public JMenuItem getSendsingle() {
        return sendsingle;
    }

    /**
    * @return
    */
    public JMenuItem getShowdetail() {
        return showdetail;
    }

    /**
    * @param item
    */
    public void setSearch(JMenuItem item) {
        search = item;
    }

    /**
    * @param item
    */
    public void setSendmulti(JMenuItem item) {
        sendmulti = item;
    }

    /**
    * @param item
    */
    public void setSendsingle(JMenuItem item) {
        sendsingle = item;
    }

    /**
    * @param item
    */
    public void setShowdetail(JMenuItem item) {
        showdetail = item;
    }

}
Avatar billede Slettet bruger
29. juni 2004 - 15:39 #1
Hvis du laver en constructor i klassen PopupMenu som evt ser således ud:

public PopupMenu(JTable minTabel) {
  this.minTable = minTable;
}

så har du mulighed for at arbejde med din Tabel i actionPerformed()-metoden, da du har en reference til den...
Avatar billede mungojerrie Nybegynder
30. juni 2004 - 09:09 #2
ja, det har du selvfølgelig ret i, men jeg har ikke prøvet at lave gui særligt meget og er også interesseret i at vide om det designmæssigt er korrekt.

Måske skulle mine mouse events ligge på min jtable klasse i stedet for ??
Avatar billede Slettet bruger
30. juni 2004 - 10:48 #3
Jeg kan ikke se noget forkert i den måde du (designmæssigt / arkitektonisk) har designet din GUI på, det er vist en meget normal fremgangsmåde du har valgt. Der er jo mange forskellige måder at lave GUI på, og der er skrevet mange bøger, der hver kommer med deres egen måde / filosofi på hvad der er "korrekt".

Jeg kører altid efter at designe mest mulig efter patterns (GRASP). Så længe du har i baghovedet at du skal udvikle efter at ha' High Cohesion samt Low Coupling er du sikker på at din arkitektur er iorden. Jeg synes ikke din kode bryder dette princip.

Jeg tillader mig lige at ligge et svar :-)
Avatar billede mungojerrie Nybegynder
02. juli 2004 - 10:48 #4
takker for svaret og du er blevet belønnet. :-)
Avatar billede Slettet bruger
02. juli 2004 - 19:02 #5
Så siger jeg tak for pointene :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Lead DevSecOps

Nextway Software A/S

Software Architect

Capgemini Danmark A/S

IGNITE Graduate Program 2026