【问题标题】:component moves to original position when window is resized调整窗口大小时组件移动到原始位置
【发布时间】:2014-01-23 07:44:24
【问题描述】:

我有一个可拖动的 JPanel,它使用 NetBeans IDE JFrame 表单编辑器添加到 JFrame 中。当我运行程序并将卡片拖动到原始位置以外的某个位置并调整 JFrame 的大小时,JPanel 将返回到其原始位置。

之前(程序首次运行时):

移动卡片:

调整大小的窗口:

我不知道为什么会发生这种情况以及如何防止它。

我的框架:

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;
    }


}

我想知道如何防止卡片回到最初的位置。 提前致谢。

【问题讨论】:

    标签: java swing mouseevent jcomponent window-resize


    【解决方案1】:

    默认情况下,IDE 将使用布局管理器在框架上定位组件。

    当您拖动面板时,您手动设置面板的位置并覆盖由布局管理器确定的位置。

    但是,当您调整框架大小时,布局管理器代码会再次执行,并且面板会恢复到原来的位置。

    您需要更改代码,以便您拖动的面板的父面板使用“空布局”。但是,当您这样做时,您现在负责设置面板的大小和位置。

    【讨论】:

    • 是的,我刚下电脑就想到了,但我无法回到电脑上回答我自己的问题。
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多