- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
来自 BorderLayout javadoc:
A border layout lays out a container, arranging and resizing its components to fit in five regions: north, south, east, west, and center. Each region may contain no more than one component, and is identified by a corresponding constant: NORTH, SOUTH, EAST, WEST, and CENTER.
我有一个程序,基于 another SO question ,它会创建一个在 BorderLayout 中心包含一个按钮的 JFrame UI,等待 5 秒,然后将另一个按钮放在同一位置。由于声明(每个区域可能包含不超过一个组件),我希望第二个按钮取代第一个按钮。但是,原始按钮仍然“卡在周围”。代码如下:
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class ReplaceBorderLayoutComponent extends JFrame
{
private static final long serialVersionUID = 1L;
public static void say(String msg) { System.out.println(msg); }
public void createUI()
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
try
{
SwingUtilities.invokeAndWait
(
new Runnable()
{
public void run()
{
// setLayout(new BorderLayout());
JButton longText = new JButton("Quite a long text");
/*getContentPane().*/add(longText, BorderLayout.CENTER);
pack();
setVisible(true);
say("longText = " + longText.toString());
}
}
);
}
catch (Exception e) {}
}
public void replaceComponent()
{
try
{
SwingUtilities.invokeAndWait
(
new Runnable()
{
public void run()
{
JButton anotherText = new JButton("Another text");
/*getContentPane().*/add(anotherText, BorderLayout.CENTER);
pack();
validate();
repaint();
say("anotherText = " + anotherText.toString());
}
}
);
}
catch (Exception e) { }
say("replaced");
}
public Component getComponent(String constraint)
{
BorderLayout bl = (BorderLayout)getContentPane().getLayout();
return bl.getLayoutComponent(constraint);
}
public static void main(String ... args)
{
ReplaceBorderLayoutComponent st = new ReplaceBorderLayoutComponent();
st.createUI();
try { Thread.sleep(5000); } catch (InterruptedException ie) {}
st.replaceComponent();
Component c = st.getComponent(BorderLayout.CENTER);
say("Center component = " + c.toString());
String otherPlaces[] = { "North", "South", "East", "West", "First", "Last", "Before", "After" };
for (String s : otherPlaces)
{
Component c2 = st.getComponent(s);
if (c2 != null) { say("found additional component at " + s + ", " + c2.toString()); }
}
}
}
当我运行它时,第一个按钮适本地占据了框架的所有空间。如果我调整它的大小,它会按预期扩展。当延迟代码运行时,它将第二个按钮放入框架中,但如果我展开框架,我可以看到两个按钮。第二个按钮按照中心组件的正常情况展开;第一个按钮保持添加第二个按钮时的大小(例如,如果我在添加之前扩展框架,则会扩展)。
添加后,将鼠标悬停在第二个按钮上会隐藏第一个按钮;调整框架大小会在第二个框架的顶部重新显示第一个框架。如果第一个按钮不可见,则将鼠标悬停在其位置上会显示它,至少有时是这样。
我必须得出结论,第一个按钮仍然是框架布局中某处的一部分(例如,它在单击时显示默认动画),但我不知道在哪里。我有代码确保它不在任何其他 BorderLayout 组件中,并且中心组件确实是第二个按钮。
我删除了一个和两个对 pack() 的调用 - 这两个按钮的行为相同。
原始问题的发布者通过在添加第二个组件之前删除第一个组件解决了他的问题,但我想了解该程序中仍在引用第一个按钮的位置。有人可以帮忙吗?
最佳答案
我将尝试回答我自己的问题,主要基于 kleopatra 和 AndrewThompson 的有用评论。
BorderLayout 文档说“每个区域只能包含一个组件”;显然没有代码可以强制执行此操作,这取决于用户是否这样做。
我对程序行为的最佳猜测:当第二个组件被添加到容器中时,它被适本地放置在 borderlayout 的“中心”区域(它有自己的组件引用)。第一个组件仍在容器中,但不在布局中,因此它仍然可以渲染,并且可能出现在其他项目的顶部或底部;行为并未真正定义,因为它不再由布局容器管理。
我认为这是相当不幸的;这是我遇到的第一个组件可以位于容器中但不能位于布局管理器中的情况,事实上这是我第一次考虑这样的事情。我将它们视为两个密切互动的对象,而不是我需要帮助管理其协调的一对。
如果我知道向谁建议的话,我建议加强 BorderLayout javadoc,并提及用户有责任不要将两个组件放入一个区域。
关于java - BorderLayout -- 替换 BorderLayout 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18673401/
我想对一个字符串执行搜索和替换,比如 password。 正如您从问题中了解到的那样,替换后的字符串应变为 sdvvzrug。 但不幸的是,下面的代码输出bbbbcaab: $search = ran
我正在使用 futurize --stage2它应用了许多源代码转换以使代码 python2 和 python3 兼容。其中一个修复是所有分区 a/b 都替换为 old_div(a/b),我想避免这种
我正在使用 RStudio,但我在控制台上的输出被截断了。我找不到如何停止截断(我尝试搜索 ?options 以及在谷歌上搜索的时间比我想承认的要长)。 编辑:我向大家道歉!我最初的长名称为“This
我有一个 fragment 堆栈,我在其中使用替换和相加。添加或替换我的 fragment 的代码(在我的 Activity 中)如下 private fun addFragment(fragment
我在一个数组中插入了一些字符串,但在我这样做之前,我想按照主题所说的去做。只用 %20 替换空格,我这样做: Name.push(linkText.replace(" ", "%20")); 但是我如
我正在尝试编译和测试我在网上看到的代码 Expanding an IP add 。但是,当我尝试编译它时,我收到有关 StringBuilder 替换方法的错误。它说: IPadd.java:52:
我正在尝试使用 dplyr 的最新功能重写我的部分代码,方法是将 data.frame() 替换为 data_frame() 和 cbind() 与 bind_cols(): library(rgeo
我最近偶然发现了 replace()和 "[ x.tst s.tst s.tst [,1] [,2] [,3] [1,] 0 0 0
我一直想知道,如何在给定的参数内进行替换。 如果你有这样的一行: 123,Hello,World,(I am, here), unknown 你想更换 World与 Foobar那么这是一个简单的任务
如何转义字符串中的双引号?例如, input: "Nobody" output: \"Nobody\" 我尝试过这样的操作,但不起作用: String name = "Nobody"; name.r
我正在做类似的事情: SQL sql sQl SqL var ps = document.getElementsByTagName('p'); for(var i = 0; i 但它不会替换文本。
我正在尝试用 \" 替换所有 " 并用 JSON 解析字符串,但浏览器抛出错误 SyntaxError: JSON Parse error: Unrecognized token '\'. 下面是代码
大家好,在这里挣扎...... 是否可以将第一个正斜杠之间的任何内容替换为“”,但保留其余部分? 例如var 将是 string "/anything-here-this-needs-to-be-re
在下面的代码中,JavaScript 替换函数中的 alert(a) 将提醒匹配的字符串,在本例中,将是 {name} 和 {place}。 这按照文档 javascript docs 的描述工作,即
+-----------------------------+ | tables | +-------------------
我正在尝试用\"替换包含 "的字符串,下面是我尝试过的程序 String s="\"/test /string\""; s = s.replaceAll("\"", "\\\"");
var text = "a's ..a's ...\"... "; text = convert(text); function convert( text ) { var n = text
我正在尝试使用 JavaScript 中的替换函数,但有一个问题。 strNewDdlVolCannRegion = strNewDdlVolCannRegion.replace(/_existing
好吧,首先我对我的上一篇文章感到非常抱歉,但我真的需要帮助,我会把我真正想要的东西放在一个更清晰的代码中。我不擅长 javascript,所以希望你能帮助我。
我正在写一张纸条,遇到了障碍。可能有更有效的方法来执行此操作,但我对 Python 还很陌生。我正在尝试创建用户生成的 IP 地址列表。我正在使用 print 来查看生成的值是否正确。当我运行此代码时
我是一名优秀的程序员,十分优秀!