2011-09-10 7 views
3

私は何かの手が必要です。コンポーネントがどのパネルに属しているかを調べるにはどうすればいいですか?

私はオブジェクトでいっぱいのパネルを手に入れました。これらのオブジェクトはそれぞれ、パネル内にパネルを作成します。パネルにはラベルが表示されます。それは自家製の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) { 
    } 
} 

} 

ありがとうございます!

+1

うーん...それほど似ているとJTableを使用してみませんか?それ以外の方法では、常に「ライブ」コンポーネントが必要な場合は、適切なバインドを行わないのはなぜですか? – kleopatra

答えて

4

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()メソッドでプロパティを追加してから、それを取得することができます。

その後、

イベントハンドラ内からプロパティを取得:

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

あなたはそれがとても上の親だと見つけるために、コンポーネント上getParent()メソッドを使用することができます...

+0

これは本当に便利ですね。私は何かを明確にしたいと思います。 putClientProperty()を使用し、すべてのラベルにパネルに対応する同じIntegerを指定しますか?したがって、1つのパネルのすべてのラベルには1があり、次のラベルには2が付いていますか?それとも私はこれを間違って理解していますか? – Martin

+0

@Martin:あなたがSwingを使うなら、これはかなり標準的なアプローチだと思います。 – Heisenbug

+0

@Martin:no。私のほうは例だった。 putClientPropertyのリンクされたドキュメントを見てください。あなたはそのメソッドを使って必要なものを置くことができます(汎用のObjectパラメータを取ります)。もちろん、同じ種類の異なるオブジェクトを区別したい場合は、異なるID(例では異なる整数)を使用する必要があります。 – Heisenbug

1

作成したすべてのパネルに同じマウスリスナーを追加します。クリックされたパネルを取得するには、actionEventのgetSource()メソッドを使用します。

あなたがたMouseEvent自体からイベントを生成したソース・コンポーネントを取得し使用することができます
1

このスニペットは役立つかもしれない、

JPanel panel = (JPanel)yourComponent.getParent(); 
関連する問題