1

あるjLabelが別のjLabelの上にあるかどうかを読みたいです。jLabel1 を jLabel2 の上にドラッグしてそこにドロップし、それが上にある場合は何かを行います。コード:

package javaapplication5;

import java.awt.Component;
import java.awt.Point;

public class NewJFrame extends javax.swing.JFrame {
    boolean OptionsDrag = false, OptionsDrop = false;
    private Point initialLoc;
    private Point initialLocOnScreen;
    /**
     * Creates new form NewJFrame
     */
    public NewJFrame() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMaximumSize(new java.awt.Dimension(400, 300));
        setMinimumSize(new java.awt.Dimension(400, 300));
        getContentPane().setLayout(null);

        jLabel1.setBackground(new java.awt.Color(0, 0, 255));
        jLabel1.setOpaque(true);
        jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mousePressed(java.awt.event.MouseEvent evt) {
            jLabel1MousePressed(evt);
        }
        public void mouseReleased(java.awt.event.MouseEvent evt) {
            jLabel1MouseReleased(evt);
        }
    });
    jLabel1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
        public void mouseDragged(java.awt.event.MouseEvent evt) {
            jLabel1MouseDragged(evt);
        }
    });
    getContentPane().add(jLabel1);
    jLabel1.setBounds(90, 130, 48, 48);

    jLabel2.setBackground(new java.awt.Color(0, 255, 255));
    jLabel2.setOpaque(true);
    jLabel2.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            jLabel2MouseEntered(evt);
        }
    });
    getContentPane().add(jLabel2);
    jLabel2.setBounds(230, 80, 48, 48);

    jLabel3.setText("showed");
    jLabel3.setVisible(false);
    getContentPane().add(jLabel3);
    jLabel3.setBounds(40, 30, 37, 20);

    pack();
}// </editor-fold>                        

private void jLabel1MousePressed(java.awt.event.MouseEvent evt) {                                     
    Component comp = (Component)evt.getSource();
    initialLoc = comp.getLocation();
    initialLocOnScreen = evt.getLocationOnScreen();
}                                    

private void jLabel1MouseReleased(java.awt.event.MouseEvent evt) {                                      
    Component comp = (Component)evt.getSource();
    Point locOnScreen = evt.getLocationOnScreen();

    int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
    int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
    comp.setLocation(x, y);
    OptionsDrop = true;
}                                     

private void jLabel1MouseDragged(java.awt.event.MouseEvent evt) {                                     
    Component comp = (Component)evt.getSource();
    Point locOnScreen = evt.getLocationOnScreen();

    int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
    int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
    comp.setLocation(x, y);
    OptionsDrag = true;
}                                    

private void jLabel2MouseEntered(java.awt.event.MouseEvent evt) {                                     
    if(OptionsDrag == true && OptionsDrop == true){
        jLabel3.setVisible(true);
    }
}                                    

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}
    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    // End of variables declaration                   
}

jLabel1 を移動できますが、Preview_1 という名前の別のラベルにドロップすると、何もしません。ドラッグアンドドロップすると問題ないことがわかりましたが、シアンブロックにマウスを置いて入力した場合にのみ機能します。青いボックスがマウスの代わりにシアンの上にあるときにそれを行うことは可能ですか?

4

1 に答える 1

2
  • 最初に変数の名前を変更して、コードが自己コメントになるようにします。はい、これは単純なサンプル プログラムですが、この小さな変更が大きな違いを生む可能性があります。

例えば:

private javax.swing.JLabel mobileLabel;
private javax.swing.JLabel fixedLabel;
private javax.swing.JLabel notificationLabel;
  • マウスがその上にあるかどうかはあまり気にしませんが、ドラッグされたコンポーネントが上にあるかどうかは気にしないので、私は MouseListener を fixedLabel に追加しません。
  • むしろ、交差テストは mobileLabel の MouseListener にある必要があります。
  • 交差をテストする 1 つの方法は、2 つのコンポーネントの Rectangle を抽出し (または、複数のコンポーネントをループ処理する必要がある場合は for ループを使用して、Rectangle を抽出しながら)、1 つの Rectangle が別の Rectangle と交差するかどうかをテストすることです。
  • オーバーラップがある場合、mobileLabel を fixedLabel の中央に配置するかどうかはわかりません。その場合、固定位置を取得し、それを使用して移動位置を設定できます。
  • 別の可能な解決策は、Java のドラッグ アンド ドロップ機能を使用することです。

例えば:

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;

@SuppressWarnings("serial")
public class NewJFrame2 extends javax.swing.JFrame {
   private static final String OVERLAID = "Overlaid!";
   boolean OptionsDrag = false, OptionsDrop = false;
   private Point initialLoc;
   private Point initialLocOnScreen;

   public NewJFrame2() {
      initComponents();
   }

   private void initComponents() {
      mobileLabel = new javax.swing.JLabel("Mobile");
      mobileLabel.setForeground(Color.white);
      fixedLabel = new javax.swing.JLabel("Fixed");
      notificationLabel = new javax.swing.JLabel();

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      setMaximumSize(new java.awt.Dimension(400, 300));
      setMinimumSize(new java.awt.Dimension(400, 300));
      getContentPane().setLayout(null);

      mobileLabel.setBackground(new java.awt.Color(0, 0, 255));
      mobileLabel.setOpaque(true);
      mobileLabel.addMouseListener(new java.awt.event.MouseAdapter() {
         public void mousePressed(java.awt.event.MouseEvent evt) {
            jLabel1MousePressed(evt);
         }

         public void mouseReleased(java.awt.event.MouseEvent evt) {
            jLabel1MouseReleased(evt);
         }
      });
      mobileLabel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
         public void mouseDragged(java.awt.event.MouseEvent evt) {
            jLabel1MouseDragged(evt);
         }
      });
      getContentPane().add(mobileLabel);
      mobileLabel.setBounds(90, 130, 48, 48);

      fixedLabel.setBackground(new java.awt.Color(0, 255, 255));
      fixedLabel.setOpaque(true);
// !!     fixedLabel.addMouseListener(new java.awt.event.MouseAdapter() {
//         public void mouseEntered(java.awt.event.MouseEvent evt) {
//            jLabel2MouseEntered(evt);
//         }
//      });
      getContentPane().add(fixedLabel);
      fixedLabel.setBounds(230, 80, 48, 48);

      //!! notificationLabel.setText("showed");
      // !! notificationLabel.setVisible(false);
      getContentPane().add(notificationLabel);
      // notificationLabel.setBounds(40, 30, 37, 20); //!!
      notificationLabel.setLocation(40, 30);  //!! 
      notificationLabel.setSize(notificationLabel.getPreferredSize()); //!! 

      pack();
   }

   private void jLabel1MousePressed(java.awt.event.MouseEvent evt) {
      Component comp = (Component) evt.getSource();
      initialLoc = comp.getLocation();
      initialLocOnScreen = evt.getLocationOnScreen();
   }

   private void jLabel1MouseReleased(java.awt.event.MouseEvent evt) {
      Component comp = (Component) evt.getSource();
      Point locOnScreen = evt.getLocationOnScreen();

      int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
      int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
      comp.setLocation(x, y);
      OptionsDrop = true;

      if (compIntersectsFixed(comp)) {

         // if you want to place the mobileLabel directly on top
         // of the fixedLabel
         comp.setLocation(fixedLabel.getLocation());
         repaint();
         notificationLabel.setText(OVERLAID);
         notificationLabel.setSize(notificationLabel.getPreferredSize());
      } else {
         notificationLabel.setText("");
      }
      revalidate();
      repaint();
   }

   private boolean compIntersectsFixed(Component comp) {
      Rectangle compRect = comp.getBounds();
      Rectangle fixedRect = fixedLabel.getBounds();
      if (compRect.intersects(fixedRect)) {
         return true;
      }
      return false;
   }

   private void jLabel1MouseDragged(java.awt.event.MouseEvent evt) {
      Component comp = (Component) evt.getSource();
      Point locOnScreen = evt.getLocationOnScreen();

      int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
      int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
      comp.setLocation(x, y);
      OptionsDrag = true;
   }

// !!  private void jLabel2MouseEntered(java.awt.event.MouseEvent evt) {
//      if (OptionsDrag == true && OptionsDrop == true) {
//         notificationLabel.setVisible(true);
//      }
//   }

   public static void main(String args[]) {

      try {
         for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
               .getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
               javax.swing.UIManager.setLookAndFeel(info.getClassName());
               break;
            }
         }
      } catch (ClassNotFoundException ex) {
         java.util.logging.Logger.getLogger(NewJFrame2.class.getName()).log(
               java.util.logging.Level.SEVERE, null, ex);
      } catch (InstantiationException ex) {
         java.util.logging.Logger.getLogger(NewJFrame2.class.getName()).log(
               java.util.logging.Level.SEVERE, null, ex);
      } catch (IllegalAccessException ex) {
         java.util.logging.Logger.getLogger(NewJFrame2.class.getName()).log(
               java.util.logging.Level.SEVERE, null, ex);
      } catch (javax.swing.UnsupportedLookAndFeelException ex) {
         java.util.logging.Logger.getLogger(NewJFrame2.class.getName()).log(
               java.util.logging.Level.SEVERE, null, ex);
      }

      java.awt.EventQueue.invokeLater(new Runnable() {
         @Override
         public void run() {
            new NewJFrame2().setVisible(true);
         }
      });
   }

   // !! name changes
   private javax.swing.JLabel mobileLabel;
   private javax.swing.JLabel fixedLabel;
   private javax.swing.JLabel notificationLabel;
}
于 2013-09-10T22:49:28.313 に答える