gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:25:20 26 4
gpt4 key购买 nike

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

直到两天前,一切都进展顺利。当我选择 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);

预先感谢您提供的任何帮助。

最佳答案

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

关于java - JTabbedPane:仅绘制第一个选项卡,第二个选项卡始终为空(新手Q),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4637881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com