久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

在現有的 JPanel 上繪制 JLayeredPane

Drawing in JLayeredPane over exising JPanels(在現有的 JPanel 上繪制 JLayeredPane)
本文介紹了在現有的 JPanel 上繪制 JLayeredPane的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

限時送ChatGPT賬號..

我正在開發一款國際象棋游戲.我想讓板容器利用 GridLayout 來顯示 8x8 的 JPanel 網格.(這將使突出顯示選定方塊和有效移動等功能變得更加容易.)然后我想在這一層上添加碎片,以便可以拖放它們.我最初通過在單獨的方形 JPanel 中繪制它們來顯示這些碎片,但我認為稍后嘗試拖放它們時會出現問題.從那以后,我一直在嘗試使用 JLayeredPane 作為主容器,但遇到了幾個問題.

I am working on developing a Chess game. I want to have the board Container utilize a GridLayout to display an 8x8 grid of JPanels. (This will make functions such as highlighting selected squares and valid moves much easier.) I would then like to add the pieces over this layer so that they may be dragged and dropped. I initially had the pieces showing by drawing them in the individual square JPanels, but figured that would be a problem when trying to drag-and-drop them later. I have since been trying to use a JLayeredPane as the main container, but have encountered several issues.

一旦我為 JLayeredPane 指定了 GridLayout,無論我使用哪個 Integer 來指定要添加 JLabel 或其他類型圖像的圖層,這些片段都會被添加到網格中,從而設置它們的位置并扭曲整個電路板.我讀過使用 LayoutManagers 會干擾 JLayeredPane 上的圖層定位,所以這并不奇怪.(盡管 JLayeredPane 教程中的 Oracle 演示程序似乎可以很好地做到這一點:http://download.oracle.com/javase/tutorial/uiswing/examples/components/LayeredPaneDemo2Project/src/components/LayeredPaneDemo2.java)

One is that once I've specified the GridLayout for the JLayeredPane, regardless of which Integer I use to specify the layer to add the JLabel or other kind of image to, the pieces get added to the grid, making their positions set and and distorting the whole board. I have read that using LayoutManagers can interfere with layer positioning on the JLayeredPane, so this isn't too surprising. (Although the Oracle demo program from the JLayeredPane tutorial seems to do this just fine: http://download.oracle.com/javase/tutorial/uiswing/examples/components/LayeredPaneDemo2Project/src/components/LayeredPaneDemo2.java)

但是,我也嘗試將 JPanel 的網格放入它自己的 JPanel,然后將其添加到 JLayeredPane 的低層,我的想法是我可以添加拖動 &將圖標拖放到 JLayeredPane 更高層上的單獨、非透明 JPanel.但是,當我這樣做時,在 JLayeredPane 中簡單地擁有網格 JPanel 之后(即在添加拖放層之前),網格將不會顯示.

However, I have also tried to put the grid of JPanels into its own JPanel, then add it to a low layer of the JLayeredPane, the idea being that I could add the drag & drop icons to separate, non-opaque JPanel on a higher layer of the JLayeredPane. When I do this however, after I simply have the grid JPanel inside the JLayeredPane (i.e. before the drag-and-drop layer is added), the grid will not display.

我也嘗試過覆蓋 JLayeredPane 的paintComponent(和paint)方法來繪制片段圖像,但它們被JPanels 隱藏(我可以通過將JPanels 設置為非透明來看到它們確實存在)和據我所知,沒有在 JLayeredPane 上設置圖形圖層的選項.我也嘗試使用框架的 glassPane 來繪制碎片,但那里也出現了不良行為.

I also have tried overriding the paintComponent (and paint) methods of the JLayeredPane to draw the piece images, but they are hidden by the JPanels (I can see that they are indeed there by setting the JPanels to non-opaque) and as far as I can tell there is no option to set the layer of the graphics on the JLayeredPane. I have also tried using the glassPane of the frame to draw the pieces, but got undesired behavior there as well.

任何幫助解釋這種行為,或者我哪里出錯了,將不勝感激!

Any help explaining some of this behavior, or where I am going wrong, would be much appreciated!

推薦答案

這是一個簡單的例子,展示了如何(隨機)將棋子"從一個方格拖放到另一個方格:

Here is a simple example that shows how you might (randomly) drag and drop a "chess piece" from one square to another:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ChessBoard extends JFrame implements MouseListener, MouseMotionListener
{
    JLayeredPane layeredPane;
    JPanel chessBoard;
    JLabel chessPiece;
    int xAdjustment;
    int yAdjustment;

    public ChessBoard()
    {
        Dimension boardSize = new Dimension(600, 600);

        //  Use a Layered Pane for this this application

        layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize( boardSize );
        layeredPane.addMouseListener( this );
        layeredPane.addMouseMotionListener( this );
        getContentPane().add(layeredPane);

        //  Add a chess board to the Layered Pane

        chessBoard = new JPanel();
        chessBoard.setLayout( new GridLayout(8, 8) );
        chessBoard.setPreferredSize( boardSize );
        chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
        layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);

        //  Build the Chess Board squares

        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                JPanel square = new JPanel( new BorderLayout() );
                square.setBackground( (i + j) % 2 == 0 ? Color.red : Color.white );
                chessBoard.add( square );
            }
        }

        // Add a few pieces to the board

        ImageIcon duke = new ImageIcon("dukewavered.gif"); // add an image here

        JLabel piece = new JLabel( duke );
        JPanel panel = (JPanel)chessBoard.getComponent( 0 );
        panel.add( piece );
        piece = new JLabel( duke );
        panel = (JPanel)chessBoard.getComponent( 15 );
        panel.add( piece );
    }

    /*
    **  Add the selected chess piece to the dragging layer so it can be moved
    */
    public void mousePressed(MouseEvent e)
    {
        chessPiece = null;
        Component c =  chessBoard.findComponentAt(e.getX(), e.getY());

        if (c instanceof JPanel) return;

        Point parentLocation = c.getParent().getLocation();
        xAdjustment = parentLocation.x - e.getX();
        yAdjustment = parentLocation.y - e.getY();
        chessPiece = (JLabel)c;
        chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);

        layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
        layeredPane.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
    }

    /*
    **  Move the chess piece around
    */
    public void mouseDragged(MouseEvent me)
    {
        if (chessPiece == null) return;

        //  The drag location should be within the bounds of the chess board

        int x = me.getX() + xAdjustment;
        int xMax = layeredPane.getWidth() - chessPiece.getWidth();
        x = Math.min(x, xMax);
        x = Math.max(x, 0);

        int y = me.getY() + yAdjustment;
        int yMax = layeredPane.getHeight() - chessPiece.getHeight();
        y = Math.min(y, yMax);
        y = Math.max(y, 0);

        chessPiece.setLocation(x, y);
     }

    /*
    **  Drop the chess piece back onto the chess board
    */
    public void mouseReleased(MouseEvent e)
    {
        layeredPane.setCursor(null);

        if (chessPiece == null) return;

        //  Make sure the chess piece is no longer painted on the layered pane

        chessPiece.setVisible(false);
        layeredPane.remove(chessPiece);
        chessPiece.setVisible(true);

        //  The drop location should be within the bounds of the chess board

        int xMax = layeredPane.getWidth() - chessPiece.getWidth();
        int x = Math.min(e.getX(), xMax);
        x = Math.max(x, 0);

        int yMax = layeredPane.getHeight() - chessPiece.getHeight();
        int y = Math.min(e.getY(), yMax);
        y = Math.max(y, 0);

        Component c =  chessBoard.findComponentAt(x, y);

        if (c instanceof JLabel)
        {
            Container parent = c.getParent();
            parent.remove(0);
            parent.add( chessPiece );
            parent.validate();
        }
        else
        {
            Container parent = (Container)c;
            parent.add( chessPiece );
            parent.validate();
        }
    }

    public void mouseClicked(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}

    public static void main(String[] args)
    {
        JFrame frame = new ChessBoard();
        frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        frame.setResizable( false );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
     }
}

這篇關于在現有的 JPanel 上繪制 JLayeredPane的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Parsing an ISO 8601 string local date-time as if in UTC(解析 ISO 8601 字符串本地日期時間,就像在 UTC 中一樣)
How to convert Gregorian string to Gregorian Calendar?(如何將公歷字符串轉換為公歷?)
Java: What/where are the maximum and minimum values of a GregorianCalendar?(Java:GregorianCalendar 的最大值和最小值是什么/在哪里?)
Calendar to Date conversion for dates before 15 Oct 1582. Gregorian to Julian calendar switch(1582 年 10 月 15 日之前日期的日歷到日期轉換.公歷到儒略歷切換)
java Calendar setFirstDayOfWeek not working(java日歷setFirstDayOfWeek不起作用)
Java: getting current Day of the Week value(Java:獲取當前星期幾的值)
主站蜘蛛池模板: 中日韩av| 自拍偷拍一区二区三区 | 欧美中文视频 | 国产91亚洲精品 | 欧美日韩久| 国产一区久久精品 | 中文成人无字幕乱码精品 | 亚洲视频在线一区 | 日韩在线小视频 | 91精品国产综合久久久久久丝袜 | 亚洲精品久久久久久国产精华液 | 91视频播放| 亚洲精品大片 | 亚洲成人精品国产 | 久久久精品一区 | 国产精品a一区二区三区网址 | 亚洲欧洲精品成人久久奇米网 | 91av视频在线 | 毛片一区二区 | 久久国产传媒 | 国产福利精品一区 | 精品视频一区二区三区在线观看 | 亚洲欧美在线视频 | 秋霞电影一区二区 | 天堂国产| 欧美综合视频 | 久久久妇女国产精品影视 | 不卡一二三区 | 玖玖色在线视频 | 日韩在线不卡视频 | 亚洲一区二区在线播放 | 精品欧美一区二区在线观看视频 | 日韩精品一区二区三区在线 | 天堂一区| 精品视频在线观看 | 亚洲高清在线免费观看 | 97视频精品 | 午夜电影福利 | 日本三级在线视频 | caoporn国产精品免费公开 | 亚洲第一av |