2014-01-06 9 views
0

NetBeans IDE JFrame Form 편집기를 사용하여 JFrame에 추가 할 수있는 드래그 가능한 JPanel이 있습니다. 프로그램을 실행하고 원래 위치가 아닌 다른 위치로 카드를 드래그하고 JFrame의 크기를 조정하면 JPanel이 원래 위치로 돌아갑니다.창 크기를 조정하면 구성 요소가 원래 위치로 이동합니다.

전에 (때 프로그램을 처음 실행) :

original position

이전 카드 :

Moved Card

크기 조정 창 : 나는 '

Resized Window

왜 이런 일이 일어나고 그것을 막을 수 있는지 이해하기 위해 손해를 보았습니다.

내 프레임 :

package cards; 

import cards.cards.*; 
/** 
* 
* @author Nicki 
*/ 
public class ImgTest extends javax.swing.JFrame { 

    /** 
    * Creates new form ImgTest 
    */ 
    public ImgTest() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     card2 = new cards.cards.Card(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setTitle("Imgtest"); 
     setMinimumSize(new java.awt.Dimension(250, 250)); 
     setPreferredSize(new java.awt.Dimension(250, 250)); 

     javax.swing.GroupLayout card2Layout = new javax.swing.GroupLayout(card2); 
     card2.setLayout(card2Layout); 
     card2Layout.setHorizontalGroup(
      card2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 71, Short.MAX_VALUE) 
     ); 
     card2Layout.setVerticalGroup(
      card2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 96, Short.MAX_VALUE) 
     ); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(21, 21, 21) 
       .addComponent(card2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(158, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(21, 21, 21) 
       .addComponent(card2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(133, Short.MAX_VALUE)) 
     ); 

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

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]){ 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     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(ImgTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(ImgTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(ImgTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(ImgTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new ImgTest().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private cards.cards.Card card2; 
    // End of variables declaration     
} 

내 카드 패널 : 나는 다시 처음 위치로 이동 카드를 방지하는 방법을 알고 싶습니다

package cards.cards; 

import cards.images.CardImageProvider; 
import java.awt.Canvas; 
import java.awt.Cursor; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import javax.swing.JPanel; 

/** 
* 
* @author Nicki 
*/ 
public class Card extends JPanel { 

    private Image cardImg; 
    private Cards card; 
    private volatile int draggedAtX, draggedAtY; 


    public Card(Cards c) { 
     this.setSize(71, 96); 
     card = c; 
     cardImg = CardImageProvider.getCardImage(c); 
     addMouseListener(new MouseAdapter(){ 

      public void mousePressed(MouseEvent e){ 
       draggedAtX = e.getX(); 
       draggedAtY = e.getY(); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter(){ 
      public void mouseDragged(MouseEvent e){ 
       setLocation(e.getX() - draggedAtX + getLocation().x, 
         e.getY() - draggedAtY + getLocation().y); 
       repaint(); 
      } 
     }); 
     this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
    } 

    public Card(){ 
     this(Unknown.UNKNOWN); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     this.setSize(71, 96); 
     g.drawImage(cardImg, 0, 0, this); 
    } 

    public void setCard(Cards c) { 
     card = c; 
     cardImg = CardImageProvider.getCardImage(c); 
     repaint(); 
    } 

    public Cards getCard() { 
     return card; 
    } 


} 

. 미리 감사드립니다.

답변

1

기본적으로 IDE는 레이아웃 관리자를 사용하여 프레임에 구성 요소를 배치합니다.

패널을 끌 때 수동으로 패널 위치를 설정하고 레이아웃 관리자가 결정한 위치를 무시합니다.

그러나 프레임의 크기를 조정하면 레이아웃 관리자 코드가 다시 실행되고 패널이 원래 위치로 다시 설정됩니다.

끌기 패널의 부모 패널이 "널 레이아웃"을 사용하도록 코드를 변경해야합니다. 그러나 이렇게하면 패널의 크기와 위치를 설정해야합니다.

+0

그래, 내가 컴퓨터에서 내려야한다고 생각했지만, 컴퓨터에서 내 자신의 질문에 대답 할 수 없었다. – nimsson