0

我创建了一个非常简单的 JTabbedPane,首先创建了一个空的 JTabbedPane 对象,然后创建了 2 个稍后添加的 JPanel。每个 JPanel 都持有一个扩展 JButton 并实现 MouseListener 的对象。它们中的每一个都包含从文件加载的不同图像;图像作为缓冲图像和图像图标等在本地保存,所有这些都很好。所有这一切的重点是在调整按钮大小时允许调整图像大小(使用 getscaledinstance()),因为面板被调整大小,因为 JTabbedPane 被调整大小等等,在包含所有内容的 JFrame 中。我在扩展 JButton 的类中重写了 paintComponent() 以完成此操作。我正在使用 MigLayout 管理器,在控制布局约束、增长、填充、初始大小、首选大小等方面一切都很好。

直到 2 天前,一切都运作良好。当我拿起 MigLayout 管理器时,我做了一些更改,试图调整一些调整大小的问题。当时我正在使用组件提供的方法设置各种最小、最大和首选尺寸,而不是布局管理器。我还对 pack()、validate()、visible()、opaque() 等进行了一些愚弄,是的,我在这里阅读了有关 Swing 和 AWT 绘画的文章:http: //java.sun.com/products/jfc /tsc/articles/painting/ ,我转而越来越依赖 MigLayout。在不相关的说明中,JFrame 似乎不支持 maxsize?

不知何故,今天,无论是否使用 swing 提供的任何这些方法,无论是否使用 MigLayout 管理器来处理其中一些问题,我现在都有一个 JTabbedPane 可以正确显示我添加的第一个 JPanel,但不是第二个 JPanel- -虽然作为选项卡存在 - 选择时不显示。我已经切换了先添加哪个面板的顺序,无论我先添加哪个 JPanel,这仍然适用,告诉我 JPanel 没问题,问题很可能出在 JTabbedPane 中。我单击第二个选项卡,即 JTabbedPane 开关,但我在 JPanel 中有一个空白按钮。一些控制台系统输出语句显示以下内容:a)第二个面板及其按钮已构建 b)当我单击第二个面板和按钮应驻留的位置时,未捕获任何鼠标事件,就好像它在那个时候不存在一样;c) 当我切换到第二个选项卡时,该第二个 JPanel 中按钮的重写 paintComponent() 方法永远不会被调用,因此尽管它所在的选项卡变得可见,但实际上它从未被绘制;d) JTabbpedPane getComponentCount() 在添加第二个面板后返回正确的值 2;e) MigLayout 管理器实际上很震撼,但我离题了......

我现在无法恢复到旧代码,尽管我尽最大努力撤消导致此问题的任何更改,但我无法解决我的新问题。除了最重要的调用之外,我已经注释掉了所有内容:每个对象的构造函数——使用 MigLayout;add() 用于使用适用于 MigLayout 的字符串参数将按钮放置在面板上;add() 用于将面板放置在 JTabbedPane 上,还带有 MigLayout 字符串参数;为 JFrame 设置关闭时的默认操作;并将 JFrame 设置为可见。这意味着我不会摆弄优化设置、双缓冲设置、不透明设置,而是将它们保留为默认设置,但仍然无法修复;第二个面板不会显示自己。我应该添加的每个面板,当它是第一个加载时,工作正常,再次确认面板和按钮本身是好的。

这是我正在做的一部分:

//Note: BuildaButton is a class that merely constructs my instances
File f = new File("/foo.jpg");
button1 = new BuildaButton().BuildaButton(f).buildfoo1Button();

f = new File("/foo2.jpg");
button2 = new BuildaButton().BuildaButton(f).buildfoo2Button();

MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(ml);
foo2panel.add(button2, "w 186:752:, h 200:807:");



tabs.add("foo1", foo1panel);
tabs.add("foo2", foo2panel);
System.out.println("contents of tabs: " + tabs.getComponentCount() + " elements");
mainframe.setLayout(ml2);
mainframe.setMinimumSize(new Dimension(850,800));
mainframe.add(tabs, "w 600:800:, h 780:780:");
//controlpanel is a still blank jpanel that holds nothing--it is a space holder for now & will be utilized
mainframe.add(controlpanel, "w 200:200:200, h 780:780:");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.setVisible(true);

提前感谢您提供的任何帮助。

4

1 回答 1

2

您不能在不同的面板上使用相同的布局实例。只需创建与 ml 完全相同的布局的第二个实例,然后在第二个面板上进行设置:

...
MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout mla = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

BorderLayout test = new BorderLayout(5,5);

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(mla);
foo2panel.add(button2, "w 186:752:, h 200:807:");
...
于 2011-01-09T09:03:17.890 回答