【问题标题】:Add mouse listner to JLabel dynamically added to a panel将鼠标侦听器添加到 JLabel 动态添加到面板
【发布时间】:2014-03-21 18:10:41
【问题描述】:

我正在向面板动态添加一些 JLabel。当用户点击标签时,它应该返回它包含的文本。我正在尝试以下代码:

 private JLabel l;
    private JPanel A;

    private void LoadLabels(){
        A.setLayout(new java.awt.GridBagLayout());
            java.awt.GridBagConstraints gbc;
            gbc = new java.awt.GridBagConstraints();
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.anchor = java.awt.GridBagConstraints.CENTER;
            gbc.weighty = 0;
            gbc.ipadx = 10;
            gbc.ipady = 10;
            gbc.insets = new java.awt.Insets(1, 1, 1, 1);

            for(int gx = 0; gx<15; gx++){
            JLabel Sold = label(String.valueOf(gx+1));
            Sold.setBackground(Color.yellow);
            gbc.gridx = gx;
            gbc.gridy = 0;
            gbc.weightx = .5;
            A.add(Sold, gbc);
    }      

    // JLabel is declared here:
    private JLabel label(String x){
            l = new JLabel(x);
            l.setFont(new java.awt.Font("Tahoma", 0, 16));
            l.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            l.setOpaque(true);
            l.setBorder(javax.swing.BorderFactory.createEtchedBorder());

            l.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));

            l.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
            lMouseClicked(evt);
            }
            });
            return l;
        }

    //Now I am writing mouseClick event like this:
    private void lMouseClicked(java.awt.event.MouseEvent evt) {                                     
    if(evt.getSource()==l){
    System.out.println(l.getText());
    } 

为什么这个鼠标事件总是返回最后一个 JLabel 文本? (输出始终为 14)如何获得每个 JLabel 的实际值?请帮忙。

【问题讨论】:

    标签: java swing mouseevent jlabel


    【解决方案1】:

    您的private JLabel l 指向添加的最后一个JLabel,它将仅返回最后一个标签中的文本。尝试创建一个数组并为创建的每个标签定义引用。

    在您的代码中发现了很多错误,请遵循正确的命名约定。 只需运行此代码并检查,只需为创建的每个 JLabel 创建引用。

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import java.awt.Color;
    
    
    class Test { 
        private int i;
    
           private JPanel A;
           private JFrame f;
           private JLabel []l;
    
           Test(){
               f=new JFrame();
               A=new JPanel();
               f.setVisible(true);
               f.setSize(800, 800);
               f.setLayout(null);
               f.add(A);
    
               LoadLabels();
           }
    
        private void LoadLabels(){
             A.setLayout(new java.awt.GridBagLayout());
    
                 l=new JLabel[15];
             for(int gx = 0; gx<15; gx++){
                         l[gx]= label(String.valueOf(gx+1));
                         l[gx].setBackground(Color.yellow);
                         l[gx].setBounds(30*gx, 30, 30, 20);
                         f.add(l[gx]);
             }             
    
         }      
    
        // JLabel is declared here:
           private JLabel label(String x){
                final JLabel l;
                   l = new JLabel(x);
                   l.setFont(new java.awt.Font("Tahoma", 0, 16));
                   l.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
                   l.setOpaque(true);
                   l.setBorder(javax.swing.BorderFactory.createEtchedBorder());
    
                   l.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
    
                   l.addMouseListener(new java.awt.event.MouseAdapter() {
                   @Override
                   public void mouseClicked(java.awt.event.MouseEvent evt) {
    
                       System.out.println(l.getText());
                   }
                   });
                   return l;
               }
    
        public static void main(String []args){
            new Test();
        }
    
    }
    

    (或)

    你可以再做一件事,

    只需在您的代码中替换以下方法

     private void lMouseClicked(java.awt.event.MouseEvent evt) {                                     
        if(evt.getSource()==l){
        System.out.println(l.getText());
        } 
     }
    

        private void lMouseClicked(java.awt.event.MouseEvent evt) {                                     
        //This will refer to current JLabel being called
        System.out.println(((JLabel)evt.getSource()).getText());
    
        } 
    

    【讨论】:

    • 非常感谢。我刚刚按照您的建议更换了鼠标侦听器并开始正常工作。我保留了其余的代码。 ——
    猜你喜欢
    • 2012-08-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多