将组件放置在玻璃板上

2023-11-30

我有一个 JLabel 的子类,它构成了我的 GUI 的一个组件。我已经实现了将组件从一个容器拖放到另一个容器的功能,但没有任何视觉效果。我想让这个 JLabel 在将项目从一个容器拖动到另一个容器时跟随光标。我想我可以创建一个玻璃板并在上面绘制它。但是,即使我将组件添加到玻璃窗格,将组件设置为可见,将玻璃窗格设置为可见,并将玻璃窗格设置为不透明,我仍然看不到该组件。我知道该组件可以工作,因为我可以将其添加到内容窗格并显示它。

如何将组件添加到玻璃板?


终于弄清楚如何让这个简单的例子工作了。谢谢,@akf。我能够根据我原来的问题调整这个解决方案,从而允许我删除大约 60 行手动呈现 JLabel 表示的 Java2D 代码。

package test;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class MainFrame extends JFrame {

    /**
     * @param args
     */
    public static void main(String[] args) {
        MainFrame mf = new MainFrame();
        mf.setSize(400, 400);
        mf.setLocationRelativeTo(null);
        mf.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        mf.setGlassPane(new JPanel());

        JLabel l = new JLabel();
        l.setText("Hello");
        l.setBorder(new LineBorder(Color.BLACK, 1));
        l.setBounds(10, 10, 50, 20);
        l.setBackground(Color.RED);
        l.setOpaque(true);
        l.setPreferredSize(l.getSize());

        //mf.add(l);
        ((JPanel)mf.getGlassPane()).add(l);
        mf.getGlassPane().setVisible(true);

        mf.setVisible(true);
    }
}

下面的示例代码展示了如何在棋盘上拖动棋子。它使用 JLayeredPane 而不是玻璃窗格,但我确信概念是相同的。那是:

a) 将玻璃窗格添加到根窗格
b) 使玻璃板可见
c) 将组件添加到玻璃窗格中,确保边界有效
d) 使用 setLocation() 为组件的拖动设置动画

编辑:添加代码来修复 SSCCE

JLabel l = new JLabel();
l.setText("Hello");
l.setBorder(new LineBorder(Color.BLACK, 1));
// l.setPreferredSize(l.getSize());
// l.setBounds(10, 10, 50, 20);
((JPanel)mf.getGlassPane()).add(l);

mf.setVisible(true);
mf.getGlassPane().setVisible(true);

使用布局管理器时,永远不要使用 setSize() 或 setBounds() 方法。在您的情况下,您只需将首选大小设置为 (0, 0),因为这是所有组件的默认大小。

当您将标签添加到框架时,它会起作用,因为框架内容窗格的默认布局管理器是边框布局,因此忽略标签的首选大小,并将标签设置为框架的大小。

然而,默认情况下,JPanel 使用 FlowLayout,它确实尊重组件的首选大小。由于首选尺寸为 0,因此无需绘制任何内容。

此外,玻璃板需要变得可见才能进行涂漆。

我建议你阅读摇摆教程。其中有关于布局管理器如何工作以及玻璃板如何工作的部分,每个部分都有工作示例。

编辑:下面添加的示例代码:

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);
     }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将组件放置在玻璃板上 的相关文章

  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 浏览时 Java Applet 不会被终止

    当用户离开加载小程序的页面时 如何停止 Java 小程序的进程 我正在使用 Chrome 现在要杀死小程序 我必须使用窗口的任务栏并杀死进程 java exe Java applet 具有生命周期方法 那些是init start stop
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • Spring MVC 和 Struts MVC 之间的区别 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Spring MVC 和 Struts MVC 之间的主要区别是什么 Spring MVC 和 Struts 之间的主要区别是 Spr
  • java中的散列是如何工作的?

    我正在尝试弄清楚java中的哈希值 例如 如果我想在哈希图中存储一些数据 它是否会有某种带有哈希值的底层哈希表 或者 如果有人能够对哈希的工作原理给出一个很好且简单的解释 我将非常感激 HashMap 基本上在内部实现为数组Entry 如果
  • 如何用 Java 制作 Windows 7 工具提示

    我一直在网上到处寻找 但没有找到这个小问题的答案 在 Windows 7 中 我认为在 Vista 中 您有一个漂亮的圆形银色工具提示 它看起来比旧的黄色盒装蹩脚工具提示要好得多 下面的 How do I make a Windows 7
  • 如何修复运行 Android 模拟器时出现 GPU Driver Issue 错误

    我的 Android 模拟器几周前运行良好 但现在出现错误 当我运行代码时 GPU 驱动程序问题错误对话框与模拟器一起弹出 当我单击 确定 时 Android 模拟器不会按预期运行应用程序 错误如下 Your GPU driver info
  • 为什么在大多数开源java项目中局部变量没有被声明为final?

    如果我查看 OpenJDK Hibernate 或 Apache 中的 java 源代码 我还没有看到任何声明为 Final 的局部变量 这表明一些最广泛使用的 java 软件库的开发人员 不要相信final关键字可以提高可读性 不相信它会
  • 如何在 WebSphere Liberty Batch 中配置事务超时?

    的作用是什么javax transaction global timeout 我是否需要实施检查点 超时 中的方法检查点算法 服务器配置级别有什么东西吗 它如何与应用程序级别的设置进行交互 2016年12月2日编辑 重新设计并解释了为应用程
  • toArray 与预先确定大小的数组

    使用时ar toArray new String ar size 安卓工作室3 2 1警告预先确定大小的数组并建议空数组 有两种方式将集合转换为数组 使用 预先确定大小的数组 如 c toArray new String c size 或使
  • 如何查找类路径中具有指定名称的所有资源?

    我想列出类路径中具有特定名称的所有文件 我预计会发生多次 因此Class getResource String 不管用 基本上 我必须识别类路径中任何位置具有特定名称 例如 xyz properties 的所有文件 然后累积读取其中的元数据
  • 为什么我在 Java 中收到有关“可能丢失精度”的警告?

    class Test public static void main String args short s 2 s1 200 s2 s2 s s1 error possible loss of precision System out p
  • 如何使用 Java Streams API 将 Map 列表与列表值合并?

    我怎样才能减少Map
  • 何时对字符串文字使用 intern()

    我看到很多这样的遗留代码 class A public static final String CONSTANT value intern 我看不出使用 intern 的任何原因 因为在 Javadoc 中可以读到 所有文字字符串和字符串值
  • 如何根据受保护的 String doInBackground 方法中 AsyncTask 的结果调用 Toast.makeText() ?

    我从 AsyncTask 中的数据库中获取数据 如果它为空 我想吐司一个警告文本 我在 AsyncTask 中尝试过 但我了解到它不是在工作线程中调用的 这是我的 doInBackground 方法 protected String doI
  • 在地图中的图块上实现鼠标单击事件

    我正在尝试在 JPanel 上实现图像 基本上是地图上的图块 的鼠标单击事件 我只是不知道该怎么做 我有一个扩展 JPanel 的 Main 类 我正在从图块服务器检索图块 并根据特定的缩放级别在 Main 类的 PaintComponen
  • 确保 MAVEN_HOME 设置正确

    这里是 Java 和 Maven 菜鸟 使用 OSX 10 8 并使用 HomeBrew 安装 Maven 1 如果我说which mvn我会得到这个 usr local bin mvn 2 如果我说echo MAVEN HOME我不会得到
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock
  • Cassandra 会话与集群 有什么可分享的?

    考虑 Cassandra 的 Session 和 Cluster 类 Java 驱动程序 我想知道有什么区别 在 Hibernate 中 每次都会创建一个会话并共享会话工厂 从许多来源我了解到 它被认为是创建一个会话并在多个线程之间共享它

随机推荐

  • QThread 工作线程中未发出 pyqtSignals

    我有一个实现BackgroundTask对象如下所示 class BackgroundTask QObject A utility class that makes running long running tasks in a separ
  • 如何允许来自所有域的 CrossOrigin?

    有没有办法让这个端点允许来自任何地方的请求 我已经尝试过 但没有一个有效 CrossOrigin 起源 CrossOrigin origins http CrossOrigin origins http localhost 3001 Get
  • 我可以在不使用外部服务的情况下在 Chrome 应用程序中获取我的 IP 地址吗?

    我正在构建一个镀铬应用程序并创建了一个UDP套接字通过镀铬插座 API 有没有办法找回自己的IP地址不使用外部服务 我所说的 自己的 IP 地址 是什么意思 两者client and server位于同一网络上 这镀铬应用程序需要回答一个U
  • PHP 多输入搜索

    我目前正在研究一些 PHP 并且有 3 个文本输入 在 MySQL 数据库中搜索这些值 并应返回与输入条件相对应的任意数量的结果 这是搜索表单
  • 如何直接从 Java 调用 Clojure 函数 [重复]

    这个问题在这里已经有答案了 我有 Clojure 函数generate id 源代码 ns url62 core defn generate id int to base62 java math BigInteger clojure str
  • 在Android中的表格布局中设置列的相等宽度[重复]

    这个问题在这里已经有答案了 可能的重复 XML 表布局 两个等宽的行充满了等宽的按钮 我在用TableLayout以 4 列显示数据列表 问题描述 我无法将我的所有 4 列设置为相等宽度TableLayout 我正在放置我正在使用的布局代码
  • 剪切图像而不裁剪

    我正在尝试使用 python 对图像进行剪切变换 我正在使用 skimage scikit image opencv 或类似的工具也可以完成我认为的工作 问题是 每当我尝试使用仿射变换和扭曲 skimage 进行剪切时 图像都会出现 裁剪
  • 使用 Laravel 4 自动生成模型类(也称为使用 L4 的现有数据库)

    我已经在 MySQL Workbench 中设计了数据库 并设置了所有外键等 我想在 Laravel 4 中使用这个数据库模式 但是从文档中看 没有任何关于使用现有数据库表集的能力 根据我的理解 其他框架 例如带有 烘焙 功能的 Cake
  • 页面方法未定义

    我正在设置 PageMethods 以使用 javascript 访问服务器端代码 当我使用 firebug 进行调试时 收到错误 PageMethods 未定义 服务器端代码也没有被触发 我已将脚本管理器 EnablePageMethod
  • 我如何通过优先ID列表对mysql结果进行排序?

    我有一个大型产品数据库 每个星期日 我的脚本都会激活 50 个新产品 问题是 根据我脚本中的一些规则 我发现一些我应该优先激活的产品 对于您的示例 假设它应该始终优先激活名称为 hello kitty 和 meshuggah 的产品 然后再
  • 插件 videoPlayer PhoneGap 不起作用

    我使用 cordova 2 9 0 并且安装了 videoPlayer 插件 https github com macdonst VideoPlayer 我在 config xml 中添加了插件 并在声明 cordova js 后在 ind
  • com.ibm.mq.MQException:MQJE001:完成代码“2”,原因“2035”

    我正在构建一个应该能够连接到 IBM WebSphere MQ 队列管理器的 Java 应用程序 但我不明白为什么我不断收到此错误 我已经使用我的用户 ID 拥有管理权限setmqaut通过 MQ 资源管理器 我还定义了MCAUSER在我的
  • 在for循环中读取csv文件并分配数据框名称[重复]

    这个问题在这里已经有答案了 可能的重复 将多个 CSV 文件读取到单独的数据框中 我需要将多个 csv 文件从一个文件夹读入数据帧 csv 文件名的格式为fxpair yyyy mm csv 例如 AUDJPY 2009 05 csv 我想
  • 单例对于微博网站来说是一个好的设计模式吗?

    我过去在项目中没有使用过任何 OO 因为我让它更简单 实际上使用古老的 mysql query 调用和我自己的过滤 所以我想开始一个新项目 学习在我的 OO 中使用设计模式 我想建立一个微博网站来娱乐一下 然后发现单例设计模式类看起来很完整
  • 未显示 Azure Web App/虚拟目录上的节点应用程序

    我已经找到一篇文章 但没有与当前 Azure Web App 配置选项匹配的文章 我想新版本中有些东西发生了变化 我正在尝试通过 Azure Web App 和 Linux 应用服务计划托管节点应用程序 我的问题是 我的节点应用程序的内容没
  • Google Maps API,所有标记打开相同的信息窗口

    我有一个页面 可以检索一堆位置和一些有关其关联标记的数据 并将它们放在 Google 地图上 单击时 每个按钮都会弹出自己的小消息 但是 单击其中任何一个都会在最近添加的标记处弹出最近添加的消息 是什么赋予了 我没有正确编写点击事件脚本吗
  • 可可 NSView 模糊背景

    我知道可以在 Cocoa 中创建透明窗口 尽管可以模糊其后面的内容吗 我知道有过类似的问题 但它们处理的内容更加模糊实际 NSView 中的内容 而不是其背后的内容 这是否可能 如果可以 我需要研究什么方法 Possible Impossi
  • Math ML 的 .NET 组件,可以编辑公式,将其呈现为图像

    目前最受欢迎的组件 MathML Net 无法下载 我想知道是否有其他 Net 组件可以帮助解决此问题 可以编辑公式 将其渲染为图像 I found g分子 就在不久前 它应该呈现 MathML 并且它是用 C 为 Winforms 编写的
  • 使用 R 3.6.0 编译 stan 文件时出错。和赢10

    Error in compileCode f code language language verbose verbose Compilation ERROR function s method s not created Error in
  • 将组件放置在玻璃板上

    我有一个 JLabel 的子类 它构成了我的 GUI 的一个组件 我已经实现了将组件从一个容器拖放到另一个容器的功能 但没有任何视觉效果 我想让这个 JLabel 在将项目从一个容器拖动到另一个容器时跟随光标 我想我可以创建一个玻璃板并在上