簡體   English   中英

如何在不刪除當前繪制的圖形的情況下將 JPanel 添加到 JFrame?

[英]How to add a JPanel to JFrame without deleting currently drawn graphics?

我正在使用 java gui(揮桿,awt)制作一個基本的國際象棋游戲。 我發現雖然 1,只有在 JFrame 中繪制的板最初顯示,而 2,當我開始拖動我的 cursor 時出現一塊圖像,板消失並只留下可拖動的圖像。 如何使圖像最初可見並且在拖動時不移除板?

import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color;

public class BoardGUI extends JFrame {
    
    public BoardGUI()
    {
        this.setSize(1000,1000);
        this.setTitle("Chess");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PieceImage king = new PieceImage("./king.png",500,800);
        this.add(king);
        this.setVisible(true);
    }
    
    public void paint(Graphics g)
    {
        int[] swap  = {1,2};
        String[] rowNum = {"8","7","6","5","4","3","2","1"};
        String[] ColumnLetter = {"A","B","C","D","E","F","G","H"};
        int rowCount = 0;
        int columnCount = 0;
        for(int i=100;i<900;i+=100)
        {
            for(int j=100;j<900;j+=100)
            {
                if(i==100)
                {
                    g.setColor(Color.black);
                    g.drawString(rowNum[rowCount++],i-20,j+60);
                }
                if(j==100)
                {
                    g.setColor(Color.black);
                    g.drawString(ColumnLetter[columnCount++],i+50,j+820);
                }
                if(swap[0] == 1)
                    g.setColor(Color.white);
                else
                    g.setColor(Color.black);
                swapColor(swap);
                g.fillRect(i,j,100,100);
                if(j==800)
                    swapColor(swap);
            }
        }
    }
    
    private void swapColor(int[] swap)
    {
        int temp = swap[0];
        swap[0] = swap[1];
        swap[1] = temp;
    }
}

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Graphics;
import java.awt.Point;

public class PieceImage extends JPanel {
    private ImageIcon image;
    private Point prevPos; 
    private Point pos; 
    
    public PieceImage(String imagePath, int xPos, int yPos)
    {
        if(imagePath==null)
            return;
        this.image = new ImageIcon(imagePath);
        this.pos = new Point(xPos,yPos);
        
        ClickListener clickListner = new ClickListener();
        DragListener dragListener = new DragListener();
        
        this.addMouseListener(clickListner);
        this.addMouseMotionListener(dragListener);
    }
    
    
    private class ClickListener extends MouseAdapter {
        
        public void mousePressed(MouseEvent e)
        {
            prevPos = e.getPoint();
        }
    }
    
    private class DragListener extends MouseInputAdapter {
        
        public void mouseDragged(MouseEvent e)
        {
            Point temp = e.getPoint();
            pos.translate((int)(temp.getX() - prevPos.getX())-50, (int)(temp.getY() - prevPos.getY())-50);
            
            prevPos = pos;
            repaint();
        }
    }
    
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        image.paintIcon(this, g, (int)pos.getX(), (int)pos.getY());
    }
}

您不應覆蓋 JFrame 的 paint() 方法。

JFrame 是您的頂級容器,它應該包含組件,可以根據需要進行繪制。 因此,您應該使用 go 來獲得更好的方法,而不是覆蓋 paint() 方法。 我會給你一些建議,讓你在 Swing 中創建一個國際象棋游戲:

  • 我個人從不使用 JFrame 本身,我通常在里面放置一個 JPanel 來填充整個 JFrame。

  • 您可以使用此 JPanel 並將其布局設置為 JPanel.setLayout(new GridLayout(8, 8))。 這將為您提供一個完整且響應迅速的國際象棋領域,可以填充您想要的任何組件。

  • 利用 BorderLayout 將 position 字母和數字放置在頂部 (NORTH)、左側 (WEST) 或您想要的任何位置。

  • 要實現基於拖放的游戲,一個簡單的方法是在 GridLayout 中放置 64 個 JButton 並添加 MouseListener + MouseMotionListener。 mousePressed() 和 mouseReleased() 方法將有助於實際激活/停用 DnD,方法 mouseDragged() 可用於將圖標固定在鼠標上。

我希望這可以幫助您創建國際象棋游戲,祝您好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM