【问题标题】:non-rectangurlar shaped java UserControl非矩形java UserControl
【发布时间】:2012-11-12 06:44:34
【问题描述】:
  • 在 .NET 中,UserControl 可能由 Controls 组成,它可能是 Form 的一部分或更大的 UserControl 的一部分。可以使用工具箱调色板通过可视化设计器设计用户控件。

  • 我发现 java BeanForm 是 .NET UserControl 的类比。

  • 我可以在 NetBeans 中使用可视化设计器设计 BeanForm

  • 在我的库中,我可以从任何其他库中扩展 BeanForm,并且可以使用 NetBeans 中的可视化设计器设计扩展的 BeanForm。

  • 在我的主项目中,我可以将 Palette 中的所有 BeanForm 选择到我的框架中。

所以“BeanForm”是“UserControl”的java挂件。


在 .Net 中,我可以轻松地将我的 UserControl 塑造成鱼或星形或任何我喜欢的形状 只需设置 this.Region = new Region(graphicsPath)。


我知道 Java 不像 C# 那样简单,我发现 Java 示例部分描述了必要的步骤,但是 我没有找到 Shaped non-rectangular BeanForm 示例。


当然,使用新的特殊 mouseClicked(MouseEvent e) 扩展 MouseAdapter - 正如许多示例所建议的那样 - 还不够 - 这只是第一步。

  • 他们是否都忘记了 Dragged-Event 和 Focus 事件以及 Mouse-Entered 事件和 Mouse-Up 事件和 Mouse-Leave 事件以及所有其他典型的 JComponent 事件??? - 这样的组件将肯定不会像真正的 Shaped JComponent 那样表现。

请给我一个 OvalComponent-BeanForm 的示例,它可以从 Palette 中取出到我的框架上,它的行为类似于 REAL Shaped JComponent

它应该涵盖所有必要的鼠标事件和所有必要的 MouseMotion 事件以及所有拖放事件和所有键事件,以防椭圆形具有焦点或鼠标位于椭圆形上方。

(例如,我应该能够使用 Oval 的鼠标事件并将 Oval 组件扩展为可以在框架内移动的 MovingOval 组件...)


如果这对您来说工作量太大,请概述并描述我必须实施的步骤 - 例如 MouseAdapter、KeyAdapter、可能是 DragDropAdapter 或任何必要的。

请指点我该怎么做!

非常感谢。

【问题讨论】:

  • 任何组件都是矩形的。话虽如此,您可以使用不透明度来更改可点击/可见的区域。您还可以影响剪辑形状(但我会非常小心)或者您可以更改其自身的顶级容器的形状。另一个问题是,您希望子组件“适合”形状还是应该剪裁它们?
  • 好吧,MadProgrammer,你是对的,我应该澄清一下:在 C# 和 Java 中,每个控制组件在幕后都是矩形的!为了表现得像一个非矩形控件组件,一些区域必须是透明的,而且这些区域不得对鼠标事件和/或拖放事件做出反应。可以在 C# 中用 1 行代码实现这种“非矩形”行为,但在 java 中到目前为止还没有解决方案。现在我不关心“内部组件”(我不打算拥有“内部控件”)如果有“形状控制问题”的解决方案我会很高兴。你的,杰拉德

标签: java swing netbeans components controls


【解决方案1】:

每个java.awt.Shape 都有一个contains() 方法,可用于在MouseListenerMouseadapter 中进行命中测试。

【讨论】:

  • 非常感谢,重写 contains(x, y) 方法效果很好!
【解决方案2】:

好的,到目前为止没有人回答。 我想换一种说法。


假设我们有 2 个方形 CirclePanel(扩展 JPanel),大小为 100x100 像素,每个形状都形成一个圆圈,这 2 个组件显示一个红色圆圈和一个蓝色圆圈。 让我们假设 CirclePanel 在彩色圆圈之外的区域是透明的。 并且让我们进一步假设托管框架具有 Null-Layout - 所以红色圆圈与蓝色圆圈部分重叠。

为了使这些圆圈表现得像真正的控件,我们必须至少解决以下问题:

1.) 在圆圈外但非常靠近圆圈边界的 MouseClick 只能触发框架的 MouseListener - 它不能触发 JPanel 的 MouseListener。

2.) 红色区域内的 MouseClick 只能触发红色 JPanel 的 MouseListener - 它不得触发蓝色 JPanel 的 MouseListener,也不得触发框架的 MouseListener。

3.) 蓝色区域内的 MouseClick 只能触发蓝色 JPanel 的 MouseListener - 它不能触发红色 JPanel 的 MouseListener,也不能触发框架的 MouseListener。

4.) 实现这一切所需的源代码必须在 CirclePanel.java 文件中,并且框架的 java 不得关心这些问题。这是因为这些形状的控件必须在任何框架中起作用。

这对需求的描述不同。

任何人都可以请现在指点我,如何在java中完成它。 你的,杰拉德

【讨论】:

  • 我认为您应该更新您的问题以将其添加到“活动”问题队列中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多