- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
堆栈溢出!
我正在开展一个项目,涉及制作导航系统,我们正处于开始阶段,正在绘制 map 并自行导航。我们有一个函数,您应该能够在已经绘制的当前数据之上绘制一个正方形。我想避免在每个 mouseDragged 操作事件中重新绘制道路的所有数据。为此,我发现使用玻璃板将是最佳选择。
问题与玻璃板的尺寸及其读取的坐标有关。当我单击 JPanel 上的某个点(我们用来在其上绘图)时,它知道如何以及在何处正确放大,但是当我绘制正方形时,它会在鼠标位置上方绘制特定数量的像素。这似乎是因为我的玻璃板尺寸与我的 JPanel 尺寸不对应。玻璃 Pane 似乎也覆盖了我的菜单栏,而 JPanel 本身不读取菜单栏上发生的点击。
我想以某种方式将玻璃板安装到我的 JPanel 上,并且我尝试了一些不同的方法。我尝试过的一件事是在 JRootPane 而不是 JPanel 上绘图,但这似乎不可能。然后我尝试从我的 JPanel(它也有自己的类)中检索“MyGlassPane”类,并调用它的重绘方法,但这就是问题的根源。最近,我检索了 JPanel 本身使用或属于其一部分的 JRootPane,然后检索了此 JRootPane 的玻璃 Pane ,但似乎添加到 JFrame 的我的菜单栏也是此 JRootPane 的一部分,这意味着glasspane 也覆盖了菜单栏。
这里有一些非常简化的代码,它涵盖了这个问题,但没有涵盖鼠标监听或数据绘制方面。然而,它确实显示了这样一个事实:在菜单栏顶部绘制矩形是很烦人的。
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
public class TestForRootPaneStuff {
JFrame frame = new JFrame();
JRootPane root;
JPanel panel = new JPanel();
JLabel label = new JLabel("Hello there!");
public void rootPanePls()
{
frame.add(panel);
panel.add(label);
root = panel.getRootPane();
JMenuBar menubar = new JMenuBar();
JMenu prettyMenu = new JMenu("Pretty");
menubar.add(prettyMenu);
frame.setJMenuBar(menubar);
MyGlassPane gp = new MyGlassPane();
root.setGlassPane(gp);
gp.setVisible(true);
gp.setEnabled(true);
gp.repaint();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(250, 250));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
TestForRootPaneStuff derp = new TestForRootPaneStuff();
derp.rootPanePls();
}
private class MyGlassPane extends JComponent implements ItemListener
{
//React to change button clicks.
@Override
public void itemStateChanged(ItemEvent e) {
setVisible(e.getStateChange() == ItemEvent.SELECTED);
}
//Draw the square for zoomToSquare
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.BLUE);
g.drawRect(10, 10, 100, 100);
}
}
}
这是一个 corresponding screenshot, as a result of running this code. (由于此处缺乏 Activity ,我无法发布直接图像)
我希望我的解释至少有一点道理。我知道我的解释对于实际解决问题来说可能有点太深入了,但我觉得有必要让你们更多地了解我的情况,以及我需要解决方案的原因.
长话短说:我需要一种方法来使 glassPane(从某处检索/设置)完全适合特定 JPanel 的尺寸,以便我可以为 JPanel 和 glasspanel 接收相同的鼠标事件坐标。请参阅上面的代码以了解问题的可视化。有一个聪明的方法来解决这个问题吗?设置 RootPane 玻璃板是我的最终想法......
如果有人有任何见解,请提前致谢!
基鲁~
最佳答案
不是一个较长的评论,只是根据此处发布的错误/不完整的代码进行猜测
使用JLabel代替JComponent,JComponent在API中没有任何LayoutManager,当然JLabel也一样,但它是非常简单的容器,就像contianer一样,是透明的,paintComponent中的任何东西都可以是(半)透明的
你的代码不完整为什么有ItemListener,不要将JComponents作为容器放入JComponent,而是使用JPanel,或者提到不透明的JLabel是GlassPane最简单的方法,第一个代码行应该是paintComponent中的super.paintComponent , dispose() 对 GlassPane 中放置/放置的任何内容进行所有自定义绘制
JLabel 可以轻松地从 JPanel 复制坐标,使用添加到 JPanel 的 ComponentListener,通过使用 Swing Timer 从 ComponentListener 删除(350-600)个事件(每一个像素一个事件),EDIT
如果调整大小继续调用timer.restart()</EDIT
,如果调整大小结束,则 Swing Action/ActionListener 将为放置在 GlassPane 中的 JLabel(无论什么)触发 setBounds
在 GlassPane 中搜索简单的 RepaintManager(只需覆盖 GlassPane 中的 JLabels 边界)以实现动画
关于java - 使 glassPane 适合 JPanel 的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22609655/
好吧,我浏览了多个论坛和谷歌,但找不到我的具体问题的答案。所以我有两个面板堆叠在一起,上面的一个是玻璃面板。当您在 glassPane 周围拖动鼠标时,它会在光标处绘制一条垂直的红线,这是有效的,但是
(在我的 Swing GUI 应用程序中)我想在单击 JButton 后调用的循环或方法中执行的某些工作期间显示 GlassPane。 例如:(单击按钮后执行的操作) if (item.equals(
我创建了一个 JPanel我在里面放了一个 JCheckBox和两个按钮: 选中复选框时,面板上方会显示一个透明色 (alpha = 100) 的玻璃 Pane ,并包含一个显示 String 的标签
当输入与我对用户的期望不同时,我有一个类在文本字段后面设置警告图标。对于文本字段,此类工作完美,但是当我尝试将其与文本区域一起使用时,警告图标未设置在正确的位置。 这是设置和删除警告图标的类: pub
此方法将从 JFrame 获取玻璃面板,该引用存储在 JPanel 对象中,我正在使用 JPanel 对象中的 getGraphics 获取图形引用,然后尝试为玻璃面板绘制背景图像,当我运行此代码时它
我用 java 构建了一个小型 GUI 游戏,有时我使用 glassPane 暂时阻止所有鼠标输入。我以前使用过 glassPane 没有任何问题,但这次它不会阻止鼠标输入。因此,在启用 glassP
是否可以为单个 JFrame 添加多个 GlassPane,或者我必须使用不舒服的 LayeredPane 和 不透明度 属性。 我附上了一些显示我想做什么的代码(由@camickr 提供)。 imp
在下面的应用程序中,我放置了一个按钮,单击该按钮使 GlassPane 可见,并启动一个线程来更新进度栏值。下面是代码:- import java.awt.Color; import java.awt
我正在尝试使用 GlassPane 在 Swing 应用程序中进行可视化拖放,但遇到了拖动图像滞后于鼠标指针的问题,有时甚至相当严重。我该如何解决这个问题?我的 GlassPane 代码如下。谢谢!
我一直在开发一个小型java应用程序,我想在应用程序的根 Pane 的玻璃 Pane 上添加一个等待图形,这里是类: public class WaitPanel extends JPanel { p
我在网络上发现了这个阻塞 GlassPane 类,我很想知道你们中的一些人是否发现它有任何问题。 public final class BlockingGlassPane extends JCompo
我有一个带有一些选项卡的 JTabbedPane,并且选项卡旁边有很多未使用的额外空间。所以我正在尝试使用它并在那里放置一些按钮(就像在 Eclipse 中一样)。我将按钮放在 GlassPane 上
我想使用 glassPane 函数在加载数据期间停用面板中的组件。我知道玻璃板仅适用于框架。在我的应用程序中,我无法访问该框架。我只想停用框架中的单个面板。 我尝试通过重写面板的paint或paint
我构建了一个简单的界面来填充我的整个 JFrame。我正在使用在互联网上发现的 FinalGlassPane 类的版本 here . 此玻璃 Pane 没有常规事件监听器,但它监视其基础组件的 AWT
我试图通过 JDialog 查看 GlassPane,但上面没有任何可见内容。为什么会发生这种情况?如何使 GlassPane 在 JDialog 上可见? 这就是我正在做的事情: public cl
我一直在尝试为我的游戏的游戏内 HUD 实现 GlassPane,但现在我似乎无法获得 JFrame 来设置我的 GlassPane 作为自己的我已经使用了 setGlassPane() 并且我一直在
我有一个需要几秒钟才能完成的 java 例程。我想加载一个 GlassPane(内部可能带有“prease wait”消息),以防止用户在该例程正在执行时修改 UI,并在例程完成时自动隐藏。为此,我使
我在玻璃面板上放置了一个组合框组件,供用户从项目列表中进行选择。当单击下拉列表时,虽然 JPopupMenu 隐藏在玻璃 Pane 上组件的其他部分后面,因为弹出窗口显示在 LayeredPane 上
堆栈溢出! 我正在开展一个项目,涉及制作导航系统,我们正处于开始阶段,正在绘制 map 并自行导航。我们有一个函数,您应该能够在已经绘制的当前数据之上绘制一个正方形。我想避免在每个 mouseDrag
这个问题可能只是因为我缺乏对 Java Swing 或 Graphics 的基本了解,如果是这样,我深表歉意。 我正在尝试使用 Java Swing 开发一个 GUI 应用程序,该应用程序可以由外部设
我是一名优秀的程序员,十分优秀!