JTabbedPane:仅绘制第一个选项卡,第二个选项卡始终为空(新手Q)

时间:2011-01-09 05:44:58

标签: java tabs paint visible jtabbedpane

我创建了一个非常简单的JTabbedPane,首先创建一个空的JTabbedPane对象,然后创建我后来添加的2个JPanel。每个JPanel都持有一个扩展JButton并实现MouseListener的对象。这些中的每一个都保存从文件加载的不同图像;图像作为缓冲图像和图像图标等在本地保存,所有这些都很有效。所有这一切都是为了在调整按钮大小时允许调整图像大小(使用getscaledinstance()),因为调整了面板的大小,因为JTabbedPane在JFrame中调整大小等等。我重写paintComponent()以在扩展JButton的类中完成此操作。我正在使用MigLayout Manager,并且在前面控制布局限制,增长,填充,初始尺寸,首选尺寸等方面都很好。按钮所具有的图像具有不同的尺寸和比例,但这之前没有引起任何麻烦。

直到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,这仍然适用,告诉我JPanels没问题,问题最有可能出现在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);

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

1 个答案:

答案 0 :(得分: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:");
...