如何找到组件所属的面板?

时间:2011-09-10 15:04:45

标签: java swing

我需要一只手。

我有一个面板,我正在填充对象。这些对象分别在面板内创建一个面板,其中填充了标签。可以这么说,这是一个自制的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 个答案:

答案 0 :(得分:4)

您可以使用从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 :(得分:1)

为您创建的所有面板添加相同的鼠标侦听器。使用actionEvent的getSource()方法获取被单击的面板。

答案 2 :(得分:1)

此代码段可能有所帮助,

JPanel panel = (JPanel)yourComponent.getParent();
相关问题