- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的问题与 Swing 编程有关。我想通过将组件(组件 x)从其父面板(组件 a)中删除并将其添加到组件 a 的父组件(组件 b)之一中来放大组件(组件 x)。在此之前,我对 b 中的所有组件调用 setVisible(false)。之后我想通过从 b 中删除它并添加到 a 来恢复它。
此后,所有组件都无法再调整大小。
为什么会这样?
一个简单的例子:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
public class SwingTest {
private static ViewPanel layer1;
private static JFrame frame;
private static JTabbedPane tabbedPane;
private static ViewPanel root;
public static void main(String[] args) {
frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setMinimumSize(new Dimension(800, 600));
root = new ViewPanel();
root.setBackground(Color.blue);
root.setPreferredSize(new Dimension(400, 600));
root.setLayout(new BorderLayout());
root.add(new JLabel("blue area"));
layer1 = new ViewPanel();
layer1.setBackground(Color.red);
layer1.setPreferredSize(new Dimension(400, 600));
layer1.setLayout(new BorderLayout());
tabbedPane = new JTabbedPane();
tabbedPane.add("A", new JLabel("A label"));
tabbedPane.setPreferredSize(new Dimension(400, 600));
layer1.add(tabbedPane);
root.add(layer1);
frame.add(root, BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
Thread t = new Thread() {
@Override
public void run() {
try {
Thread.sleep(8000);
System.out.println("start");
for (Component c : root.getComponents()) {
c.setVisible(false);
}
layer1.remove(tabbedPane);
root.add(tabbedPane);
Thread.sleep(8000);
root.remove(tabbedPane);
layer1.add(tabbedPane);
for (Component c : root.getComponents()) {
c.setVisible(true);
c.repaint();
}
} catch (InterruptedException e) {
//...
}
}
};
t.start();
}
}
最佳答案
After that all components are not longer resizable.
我认为 LayoutManager
的选择掩盖了效果。一般来说,在 event dispatch thread 上构建 GUI 是个好主意。 ,并且使用 sleep()
阻止该线程是一个坏主意。此替代示例使用 javax.swing.Timer
定期更改计时器的 actionPerformed()
方法中的内容。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.Timer;
public class SwingTest implements ActionListener, Runnable {
private JFrame frame;
private ViewPanel root;
private ViewPanel layer1;
private JTabbedPane tabbedPane;
private Timer t = new Timer(1000, this);
private boolean remove = true;
public static void main(String[] args) {
EventQueue.invokeLater(new SwingTest());
}
private static class ViewPanel extends JPanel {
public ViewPanel(Color color) { // default FlowLayout
this.setPreferredSize(new Dimension(400, 500));
this.setBackground(color);
}
}
@Override
public void run() {
frame = new JFrame(); // default BorderLayout
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(600, 600));
root = new ViewPanel(Color.blue);
root.add(new JLabel("Blue area"));
layer1 = new ViewPanel(Color.red);
tabbedPane = new JTabbedPane();
tabbedPane.add("A", new JLabel("A label", JLabel.CENTER));
tabbedPane.setPreferredSize(root.getPreferredSize());
layer1.add(tabbedPane);
root.add(layer1);
root.add(new JLabel("Blue area"));
frame.add(root, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
t.start();
}
@Override
public void actionPerformed(ActionEvent e) {
if (remove) {
for (Component c : root.getComponents()) {
c.setVisible(false);
}
layer1.remove(tabbedPane);
} else {
layer1.add(tabbedPane);
for (Component c : root.getComponents()) {
c.setVisible(true);
}
}
remove = !remove;
}
}
关于java - 移动后组件不再可调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047043/
我最近更新了 ADT 插件,我的整个 Eclipse-Android 构建系统都停止工作了。从那以后,我尝试了我在互联网上可以找到的所有关于如何解决这个问题的方法。徒然。如果有人有确定的方法来解决此问
我已经知道有类似的话题,但对我来说没有任何帮助...... 这里是信息: 该应用程序始终在模拟器和设备上运行。我最近将该项目重命名为另一个名称。仍然工作得很好。今天我意识到它没有更改文件夹名称,然后它
在装有El Capitan的MacMini上,我无法再进行冲泡了。我收到以下错误: /usr/local/Library/Homebrew/config.rb:34:in `initialize':
是的,所以我不知道发生了什么。我一直在编写一个 AJAX 评论脚本,并且它可以工作,但它不再工作了。我从备份中恢复了它,以防万一我改变了任何东西,但没有运气。它转到表单的“操作”而不是 jQuery,
请原谅我的无能...我正在尝试在全局 var 阶段不再未定义后使用 Proxy 执行一些代码。这是我天真的尝试: ``` var stage = undefined let myObj; let st
我对 segues 了解不多,但我已经开始工作了..但突然间它不再工作了...... 我的代码似乎可以工作,但没有发生 segue: NSLog(@"login started"); if ([use
我已将以下重写规则添加到我的 web.config 中。它运行良好,阻止了所有提及的推荐垃圾邮件站点。然而,今天我突然注意到 social-buttons.com 突然出现在我的 Google Ana
在 C++ 中,可以在翻译单元中使用 static 关键字来影响符号(变量或函数声明)的可见性。 在 n3092 中,这已被弃用: Annex D.2 [depr.static] The use of
升级到 com.crashlytics.sdk.android:crashlytics:2.7.1@aar 后(从 2.6.8 开始),我无法再在 Firebase 应用中禁用 Crashlytics
您好,我遇到了一些障碍,我一直在为我的应用程序重新设计菜单导航。我设法做到了。但现在我的应用程序的一项功能已决定停止运行。 想法是你摇动你的手机,它会随机选择一张图片,与应用程序分开的代码工作正常,就
我有一行(容器)包含三个元素,我想水平显示它们之间的间距相等(并且行的左侧或右侧没有空格)。我正在使用带有 justify-content:space-between 的 flexbox。 这是在 F
直到最近,我才能够在 Windows 上使用 python 3.6.7 时安装 tensorflow 1.5.0 包。现在我不能,从下面的“来自版本”的消息来看,似乎根本没有可用的 tensorflo
不确定是否与最近的更新有关,但我突然无法在 Android Studio 编辑器中获得单行间距。如果我尝试将它更改为 1,它让我设置它,但当我按下“应用”时,它会迅速恢复为 1.5。用不同的字体试过,
我遵循了有关如何在 macOS 上安装 pip 的在线说明(例如 this、this 和 this)。 我看起来很简单,但它不适合我。 我的 python --version 是 2.7.10。 当我
Due to rounding errors, most floating-point numbers end up being slightly imprecise. https://www.flo
我试图让用户从他们在 Android 上的库中选择一张图片。但是当我使用 PictureChooser 插件时,它似乎不再起作用了 我看到这段代码可以工作,但现在不行了,我也不知道为什么。
自 .NET 4.5 起,Exception.HResult 的 setter/getter 现在是 public,但它曾经是 protected。 来自 MSDN: Starting with th
今天去处理一个较旧的 Python2.7 AppEngine 标准项目,但我似乎无法让端点工作。我下载了示例代码,看看我的项目是否是罪魁祸首,但该示例也不起作用。 https://cloud.goog
我是一名优秀的程序员,十分优秀!