Как определить, к какой панели принадлежит компонент? - PullRequest
3 голосов
/ 10 сентября 2011

Мне нужна рука с чем-то.

У меня есть панель, которую я заполняю объектами.Каждый из этих объектов создает панель внутри панели, которая заполнена метками.Это домашний JTable, так сказать.Теперь мне нужно создать контекстное меню, в котором я нажимаю «Редактировать / удалить / и т. Д.».который должен знать, на какой объект я нажал.

public class Aktivitet {

static JPanel sPanel;
static String navn;
static String kontakt;
static String event;
static String oprettet;
static String note;
static String deadline;
static int tilstand;

public Aktivitet(JPanel panel, String sNavn, String sKontakt, String sEvent, String sOprettet, String sNote, String sDeadline, int sTilstand) {
    this.navn = sNavn;
    this.kontakt = sKontakt;
    this.event = sEvent;
    this.oprettet = sOprettet;
    this.note = sNote;
    this.deadline = sDeadline;
    this.tilstand = sTilstand;
    this.sPanel = panel;
    JPanel akPan = new JPanel();
    JPanel fillerPanel = new JPanel();
    if (tilstand == 0) akPan.setBackground(Color.GREEN);
    if (tilstand == 1) akPan.setBackground(Color.YELLOW);
    if (tilstand == 2) akPan.setBackground(Color.RED);
    akPan.setLayout(new GridLayout(4,3));
    akPan.setBorder(BorderFactory.createRaisedBevelBorder());
    akPan.setSize(new Dimension(10000, 75));
    akPan.setMaximumSize(new Dimension(10000, 75));
    fillerPanel.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
    fillerPanel.setSize(new Dimension(10000, 1));
    fillerPanel.setMaximumSize(new Dimension(10000, 1));        
    JLabel navnP = new JLabel();
    JLabel kontaktP = new JLabel();
    JLabel eventP = new JLabel();
    JLabel oprettetP = new JLabel();
    JLabel noteP = new JLabel();
    JLabel deadlineP = new JLabel();
    JLabel label_navn = new JLabel();
    JLabel label_kontakt = new JLabel();   
    JLabel label_event = new JLabel();
    JLabel label_oprettet = new JLabel();
    JLabel label_note = new JLabel();
    JLabel label_deadline = new JLabel();


    navnP.setText("Aktivitetsnavn:");
    navnP.setFont(new Font("dialog",Font.ITALIC,9));

    kontaktP.setText("Kontaktperson:");
    kontaktP.setFont(new Font("dialog",Font.ITALIC,9));

    eventP.setText("Event:");
    eventP.setFont(new Font("dialog",Font.ITALIC,9));

    label_navn.setText(navn);
    label_navn.setFont(new Font("monospaced",Font.BOLD,16));

    label_kontakt.setText(kontakt);
    label_kontakt.setFont(new Font("monospaced",Font.BOLD,16));

    label_event.setText(event);        
    label_event.setFont(new Font("monospaced",Font.BOLD,16));

    oprettetP.setText("Oprettet:");
    oprettetP.setFont(new Font("dialog",Font.ITALIC,9));

    noteP.setText("Evt. Note:");
    noteP.setFont(new Font("dialog",Font.ITALIC,9));        

    deadlineP.setText("Deadline:");
    deadlineP.setFont(new Font("dialog",Font.ITALIC,9)); 

    label_oprettet.setText(oprettet);
    label_oprettet.setFont(new Font("monospaced",Font.BOLD,16));

    label_note.setText(note);
    label_note.setFont(new Font("monospaced",Font.BOLD,16));

    label_deadline.setText(deadline);
    label_deadline.setFont(new Font("monospaced",Font.BOLD,16));
    akPan.add(navnP);
    akPan.add(kontaktP);
    akPan.add(eventP);
    akPan.add(label_navn);
    akPan.add(label_kontakt);
    akPan.add(label_event);
    akPan.add(oprettetP);
    akPan.add(noteP);
    akPan.add(deadlineP);
    akPan.add(label_oprettet);
    akPan.add(label_note);
    akPan.add(label_deadline);
    panel.add(akPan);
    panel.add(fillerPanel);
    panel.addMouseListener(new MouseActionListener());
    akPan.setVisible(true);
    fillerPanel.setVisible(true);
}
public class MouseActionListener implements MouseListener {

    public void mouseClicked(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }
}

}

Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 10 сентября 2011

Вы можете использовать извлечение исходного компонента, который сгенерировал событие из самого MouseEvent:

public void mouseClicked(MouseEvent e) {
     Object o = e.getSource();
}

Вы должны использовать instanceof, чтобы проверить тип источника и привести объект к нему:

if (o instanceof JLabel){
    JLabel label = (JLabel)o;
}else if (o instanceof JPanel){
    JPanel panel = (JPanel)o;
}

Чтобы различать разные компоненты одного типа, вы можете добавить к ним свойство с помощью метода putClientProperty () , а затем получить его:

JLabel label = new JLabel();
label.putClientProperty("id", new Integer(10));

затем из обработчика событий получить свойство:

if (o instanceof JLabel){
    JLabel label = (JLabel)o;
    Integer labelId = (Integer)label.getClientProperty("id");
}

Вы можете использовать метод getParent () для компонента, чтобы найти его родителя и так далее ...

1 голос
/ 10 сентября 2011

Этот фрагмент может помочь,

JPanel panel = (JPanel)yourComponent.getParent();
1 голос
/ 10 сентября 2011

Добавьте один и тот же слушатель мыши на все создаваемые вами панели Используйте метод actionEvent getSource () для получения панели, по которой щелкнули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...