Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTabbedPane:只绘制第一个选项卡,第二个选项卡始终为空(新手Q)_Java_Tabs_Paint_Visible_Jtabbedpane - Fatal编程技术网

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

Java JTabbedPane:只绘制第一个选项卡,第二个选项卡始终为空(新手Q),java,tabs,paint,visible,jtabbedpane,Java,Tabs,Paint,Visible,Jtabbedpane,我创建了一个非常简单的JTabbedPane,首先创建了一个空的JTabbedPane对象,然后创建了两个稍后添加的jpanel。每个JPanel都持有一个扩展JButton并实现MouseListener的对象。每一个都保存从文件加载的不同图像;图像作为缓冲图像和图像图标等在本地保存,所有这些都非常有效。所有这些的要点是允许在调整按钮大小时调整图像的大小(使用GetScaleInstance()),因为在保存所有内容的JFrame中,面板大小已调整,JTabbedPane大小已调整,等等。我重

我创建了一个非常简单的JTabbedPane,首先创建了一个空的JTabbedPane对象,然后创建了两个稍后添加的jpanel。每个JPanel都持有一个扩展JButton并实现MouseListener的对象。每一个都保存从文件加载的不同图像;图像作为缓冲图像和图像图标等在本地保存,所有这些都非常有效。所有这些的要点是允许在调整按钮大小时调整图像的大小(使用GetScaleInstance()),因为在保存所有内容的JFrame中,面板大小已调整,JTabbedPane大小已调整,等等。我重写paintComponent()以在扩展JButton的类中实现这一点。我使用的是MigLayout管理器,它可以控制布局约束、增长、填充、初始大小、首选大小等。按钮所持有的图像具有不同的大小和比例,但这以前没有造成任何问题

直到两天前,一切都很顺利。在拿起MigLayout manager时,我做了一些更改,试图调整一些大小调整问题。当时,我正在使用组件而不是布局管理器提供的方法设置各种最小、最大和首选尺寸。我还愚弄了一些pack()、validate()、visible()、不透明()等等,是的,我在这里读了关于Swing和AWT绘画的文章:,我开始越来越依赖MigLayout。另一方面,JFrame似乎不支持maxsize

不知何故,今天,无论是否使用swing提供的这些方法,无论是否使用MigLayout manager来处理其中的一些问题,我都有一个JTabbedPane,它正确地显示了我添加的第一个JPanel,但没有显示第二个JPanel——它虽然作为选项卡显示,但在选中时不会显示。我已经切换了先添加哪个面板的顺序,不管我先添加哪个JPanel,这仍然是正确的,告诉我JPanel是正常的,问题很可能在JTabbedPane中。我单击第二个选项卡,JTabbedPane切换,但在JPanel中有一个似乎是空白的按钮。一些console system out语句揭示了以下内容:A)第二个面板及其按钮是构造的b)当我单击第二个面板和按钮应该驻留的位置时,没有捕获任何鼠标事件,就好像它当时不存在一样;c) 当我切换到第二个选项卡时,第二个JPanel中的按钮的重写的paintComponent()方法从未被调用,因此事实上,它从未被绘制,尽管它所在的选项卡变得可见;d) 添加第二个面板后,jtabpedpane getComponentCount()返回正确的值2;e) MigLayout经理真的很厉害,但我离题了

我现在无法恢复到我的旧代码,尽管我尽了最大的努力来撤销导致这一问题的任何更改,但我无法修复我的新问题。除了最基本的调用外,我已经注释掉了所有调用:每个对象的构造函数——使用MigLayout;add(),用于使用适合MigLayout的字符串参数将按钮放置在面板上;add()用于将面板放置在JTabbedPane上,还带有MigLayout字符串参数;设置JFrame的默认op on close;并将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);

提前感谢您提供的帮助。

您不能在不同的面板上使用相同的布局实例。只需创建与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:");
...