- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当工具栏被拖离 GUI 然后关闭(将其返回到 GUI)时,为什么这段代码会抛出 IllegalArgumentException
?
我能理解为什么在没有约束的情况下添加组件可能是不合适的,但在这种情况下,最初将工具栏添加到面板(使用 GridBagLayout
)而没有约束导致没有这样的问题。为什么它会在第二次和后续添加时出现?
代码改编自this answer , 但两个代码都显示相同的问题。
import java.awt.*;
import javax.swing.*;
public class GridBagToolBarOddity {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new GridBagLayout());
JToolBar tb = new JToolBar();
tb.add(new JLabel("Drag me off, then drop me back!"));
gui.add(tb);
gui.setPreferredSize(new Dimension(300, 100));
gui.setBackground(Color.RED);
JFrame f = new JFrame("Demo");
f.add(gui);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.pack();
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:
cannot add to layout: constraints must be a GridBagConstraint
at java.awt.GridBagLayout.addLayoutComponent(GridBagLayout.java:702)
at java.awt.Container.addImpl(Container.java:1120)
at java.awt.Container.add(Container.java:966)
at javax.swing.plaf.basic.BasicToolBarUI$FrameListener.windowClosing(BasicToolBarUI.java:1265)
at java.awt.Window.processWindowEvent(Window.java:2051)
at javax.swing.JDialog.processWindowEvent(JDialog.java:681)
at java.awt.Window.processEvent(Window.java:2009)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
最佳答案
这是 BasicToolBarUI 源代码的片段
public void windowClosing(WindowEvent w) {
if (toolBar.isFloatable()) {
if (dragWindow != null)
dragWindow.setVisible(false);
floating = false;
if (floatingToolBar == null)
floatingToolBar = createFloatingWindow(toolBar);
if (floatingToolBar instanceof Window) ((Window)floatingToolBar).setVisible(false);
floatingToolBar.getContentPane().remove(toolBar);
String constraint = constraintBeforeFloating;
if (toolBar.getOrientation() == JToolBar.HORIZONTAL) {
if (constraint == "West" || constraint == "East") {
constraint = "North";
}
} else {
if (constraint == "North" || constraint == "South") {
constraint = "West";
}
}
if (dockingSource == null)
dockingSource = toolBar.getParent();
if (propertyListener != null)
UIManager.removePropertyChangeListener(propertyListener);
dockingSource.add(toolBar, constraint);
如您所见,它尝试将 constraintBeforeFloating String 作为约束传递,但 GridBagLayout 需要 GridBagConstraints。
constraintBeforeFloating = calculateConstraint();
和
private String calculateConstraint() {
String constraint = null;
LayoutManager lm = dockingSource.getLayout();
if (lm instanceof BorderLayout) {
constraint = (String)((BorderLayout)lm).getConstraints(toolBar);
}
return (constraint != null) ? constraint : constraintBeforeFloating;
}
因此,当 float 关闭时,UI 尝试将当前约束(字符串)传递给 GridBagLayout 并失败。
关于java - JToolBar IllegalArgumentException 放回 GridBagLayout 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559552/
我试图将 JMenu 和 JToolbar 放在 JFrame 的 NORTH 位置,但它们相互重叠。有什么办法可以将两者都放在 NORTH 位置吗? 最佳答案 不要尝试将两个组件添加到框架的北部。
我有一个简单的绘图应用程序。我需要在左侧添加一个菜单和一个工具栏。现在,我不再使用简单的 JFrame,而是创建一个扩展 JFrame 的简单类。我能够按照一些在线示例添加菜单,但不知道如何添加 JT
我有一个 JToolBar 并且喜欢对项目重新排序。 例如,我有一个“新建”、一个“打开”和一个“保存”按钮。 我在不同的线程中添加这些按钮,因此顺序是随机的。 不幸的是,顺序是“保存”、“打开”、“
我创建了一个 JToolbar 组件并将其添加到框架中。 工具栏使用 BorderLayout。 我向工具栏添加了三个按钮,它们显示得很好,只是我希望将它们添加到工具栏的右侧。右对齐。 然后每当我向工
如何在一个屏幕上放置多个 JToolBar 并允许它们 float 。通常我们把JToolBar放在一个有BorderLayout的容器上。如果我们将所有 JToolBar 放在一个面板上,然后将面板
Video的问题。 问题 1:无论我将其放到哪个位置,从左侧拖动任何 JToolBar 都会插入到最右侧。 问题 2:将最右边的 JToolBar 拖动到任何位置都不会产生任何变化,如视频中所示。 期
JToolBar 可以从框架或面板附加和分离到一个单独的窗口中。所以我想将它用作一组紧急命令和指示器。问题是分离时如果你最小化它所属的框架,工具栏也会最小化,我希望它留在屏幕上。 最佳答案 the
我有一个 java 应用程序,它需要动态添加包含在 jpanels 中的按钮集。例如:- . . JButton button1 = new JButton("Button_1"); JButton
我有一个 JToolbar。我想知道是否有办法阻止它水平移动。我宁愿它只垂直。我确实希望它漂浮。 我曾尝试制作属性更改监听器并将方向更改回垂直但没有成功。谢谢 最佳答案 只需使用默认 float 布局
有没有办法在现有面板的其余组件上绘制停靠的 JToolBar? 基本上,我希望在停靠工具栏时(从 float 位置)不干扰我的其他组件和现有布局。 简单的例子,只是为了开始.. public clas
我在java中使用netbeans创建了全屏jform。我需要创建全屏宽度大小的 jtoolbar。我如何做到这一点? 我使用此代码创建全屏尺寸 jform/jform 调整大小 Dimension
我想在Java中为JToolBar设置渐变背景色。我能够为 JPanel 设置此渐变效果。 谢谢,萨蒂什 最佳答案 与任何其他 Swing 组件一样,您必须重写其 paintComponent(...
我正在编写一个头部带有工具栏的程序。唯一的问题是我无法在工具栏中的组件(即日期选择器)上设置正确的大小。 screenshot 所以我想调整工具栏中日期选择器的大小。我该如何解决这个问题? 最漂亮的选
任何人都可以帮助解决这个问题我正在尝试创建一个 JToolBar 并且我希望它的所有组件的大小和位置都是固定的。我尝试了几种不同的布局管理器,但它们都会在组件所在的框架重新调整大小时调整组件的中心和/
我需要添加一个简单的间隙/空间/边距,以便在这两个按钮之间留出空间。不幸的是我无法让它发挥作用。谁能给我一些建议吗? 它基于BorderLayout,按钮位于JToolBar 最佳答案 包含这些按钮的
我使用 Java Swing (Windows Builder Pro) 为个人项目创建了一个 GUI,它有一个 JToolBar。我在工具栏中的按钮之间添加了分隔符。 JButton btnSave
私有(private) JButton btnTask = new JButton();...TaiGlobal.taskbar.add(btnTask); 如何从 JToolBar 中删除 btnT
如何消除 JToolBar 中控件之间的间隙?我希望 JToolBar 中的控件之间没有可用空间。 编辑:我错了。没有可用空间。问题是由仅带有图标的 JButton(位于 JToolBar 中)引起的
我有一个带有JToggleButtons 的水平JToolbar。由于某种原因,它被放置在一个高度更大的容器中。我的 JToggleButtons 只使用它们需要的空间,在它们下方和下方留下丑陋的空白
我正在尝试在 JToolBar 中对齐 JToggleButton。我希望按钮垂直向左对齐。我的代码如下: JToolBar toolbar = new JToolBar(); toolbar.set
我是一名优秀的程序员,十分优秀!