Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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组件何时获得其大小?_Java_Swing_Jpanel_Jtabbedpane - Fatal编程技术网

Java JTabbedPane组件何时获得其大小?

Java JTabbedPane组件何时获得其大小?,java,swing,jpanel,jtabbedpane,Java,Swing,Jpanel,Jtabbedpane,当我将JPanel添加到JTabbedPane以计算其他值时,我需要知道它的大小。如果我调用add(Component)方法,那么Component什么时候得到它的大小 比如说, JTabbedPane tabbedPane = new JTabbedPane(); JPanel panel = new JPanel(); panel.setBackGround(Color.RED); // pretty colors! tabbedPane.add(panel); int newTabInd

当我将
JPanel
添加到
JTabbedPane
以计算其他值时,我需要知道它的大小。如果我调用
add(Component)
方法,那么
Component
什么时候得到它的大小

比如说,

JTabbedPane tabbedPane = new JTabbedPane();
JPanel panel = new JPanel();
panel.setBackGround(Color.RED); // pretty colors!
tabbedPane.add(panel);

int newTabIndex = tabbedPane.indexOfComponent(panel);
tabbedPane.setSelectedIndex(newTabIndex);
提前谢谢你

编辑 @mKorbel建议将JPanel的可见性设置为true:

JTabbedPane tabbedPane = new JTabbedPane();
JPanel panel = new JPanel();
panel.setBackGround(Color.RED);
tabbedPane.add(panel);
panel.setVisible(true); // NEW LINE


int newTabIndex = tabbedPane.indexOfComponent(panel);
tabbedPane.setSelectedIndex(newTabIndex);
不幸的是,当我将此更改应用于我自己的程序时,
JPanel
的宽度和高度仍然分别为0和0。我还能试什么

组件何时获得其大小

  • JFrame.pack()之后(不是您的问题)

  • isVisible()
    在GUI中已为真(您的问题)

  • 组件何时获得其大小

  • JFrame.pack()之后(不是您的问题)

  • isVisible()
    在GUI中已为真(您的问题)


  • JTabbedPane的大小由添加到其中的最大组件的大小决定。在您的情况下,必须使用JPanel.setPreferredSize()方法设置JPanel的大小。这将确保JPanel得到正确渲染

    JTabbedPane的大小由添加到其中的最大组件的大小决定。在您的情况下,必须使用JPanel.setPreferredSize()方法设置JPanel的大小。这将确保JPanel正确呈现

    JTabbedPane
    在连接到能够布局它的容器之前不会调整大小

    Window#pack
    s的工作是确定子组件的首选尺寸,并根据布局管理器的要求确定它们的尺寸

    只有在这个时候,组件(以及您的
    JTabbedPane
    )才会调整大小

    组件也可以根据容器层次结构中的更改调整大小,但基本过程是相同的。
    JTabbedPane
    s父容器将决定何时需要更新其内容并执行新的布局操作,并根据需要调整组件的大小

    没有一个示例显示选项卡式窗格已添加到父容器

    更新为简单测试。。。 下面的示例基本上演示了何时调整组件的大小

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TestTabSize {
    
        public static void main(String[] args) {
            new TestTabSize();
        }
    
        public TestTabSize() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JPanel panel = new JPanel() {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(200, 200);
                        }
                    };
    
                    panel.addComponentListener(new ComponentAdapter() {
                        @Override
                        public void componentResized(ComponentEvent e) {
                            System.out.println("Resized to " + e.getComponent().getSize());
                        }
    
                        @Override
                        public void componentMoved(ComponentEvent e) {
                            System.out.println("Moved to " + e.getComponent().getLocation());
                        }
                    });
    
                    System.out.println("Before been added = " + panel.getSize());
    
                    JTabbedPane tabbedPane = new JTabbedPane();
                    tabbedPane.addTab("test", panel);
    
                    System.out.println("Before been added to tab = " + panel.getSize());
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    System.out.println("Before been added to frame = " + panel.getSize());
                    frame.add(tabbedPane);
                    System.out.println("After been added to frame = " + panel.getSize());
                    frame.pack();
                    System.out.println("After been packed = " + panel.getSize());
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                    System.out.println("After been visible = " + panel.getSize());
                }
            });
        }
    
    }
    
    输出…

    正如您从输出中看到的,在帧被压缩之前,没有任何大小

    Before been added = java.awt.Dimension[width=0,height=0]
    Before been added to tab = java.awt.Dimension[width=0,height=0]
    Before been added to frame = java.awt.Dimension[width=0,height=0]
    After been added to frame = java.awt.Dimension[width=0,height=0]
    After been packed = java.awt.Dimension[width=200,height=200]
    After been visible = java.awt.Dimension[width=200,height=200]
    Resized to java.awt.Dimension[width=200,height=200]
    Moved to java.awt.Point[x=11,y=33]
    

    JTabbedPane
    在连接到能够布局的容器之前,不会调整大小

    Window#pack
    s的工作是确定子组件的首选尺寸,并根据布局管理器的要求确定它们的尺寸

    只有在这个时候,组件(以及您的
    JTabbedPane
    )才会调整大小

    组件也可以根据容器层次结构中的更改调整大小,但基本过程是相同的。
    JTabbedPane
    s父容器将决定何时需要更新其内容并执行新的布局操作,并根据需要调整组件的大小

    没有一个示例显示选项卡式窗格已添加到父容器

    更新为简单测试。。。 下面的示例基本上演示了何时调整组件的大小

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TestTabSize {
    
        public static void main(String[] args) {
            new TestTabSize();
        }
    
        public TestTabSize() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JPanel panel = new JPanel() {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(200, 200);
                        }
                    };
    
                    panel.addComponentListener(new ComponentAdapter() {
                        @Override
                        public void componentResized(ComponentEvent e) {
                            System.out.println("Resized to " + e.getComponent().getSize());
                        }
    
                        @Override
                        public void componentMoved(ComponentEvent e) {
                            System.out.println("Moved to " + e.getComponent().getLocation());
                        }
                    });
    
                    System.out.println("Before been added = " + panel.getSize());
    
                    JTabbedPane tabbedPane = new JTabbedPane();
                    tabbedPane.addTab("test", panel);
    
                    System.out.println("Before been added to tab = " + panel.getSize());
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    System.out.println("Before been added to frame = " + panel.getSize());
                    frame.add(tabbedPane);
                    System.out.println("After been added to frame = " + panel.getSize());
                    frame.pack();
                    System.out.println("After been packed = " + panel.getSize());
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                    System.out.println("After been visible = " + panel.getSize());
                }
            });
        }
    
    }
    
    输出…

    正如您从输出中看到的,在帧被压缩之前,没有任何大小

    Before been added = java.awt.Dimension[width=0,height=0]
    Before been added to tab = java.awt.Dimension[width=0,height=0]
    Before been added to frame = java.awt.Dimension[width=0,height=0]
    After been added to frame = java.awt.Dimension[width=0,height=0]
    After been packed = java.awt.Dimension[width=200,height=200]
    After been visible = java.awt.Dimension[width=200,height=200]
    Resized to java.awt.Dimension[width=200,height=200]
    Moved to java.awt.Point[x=11,y=33]
    

    听起来您使用的是空布局。仅当组件所附着的容器使用布局管理器时,才会自动调整组件的大小。同样,如果父组件无效(未连接到具有本机对等的组件,它们将不会调整大小。我如何设置选项卡的布局?当我想到选项卡时,我在概念上认为它是显示另一个组件的东西,例如JPanel,而不是具有布局的东西。这里有3个元素。JTabbedPane管理选项卡和相关组件。选项卡和与选项卡关联的组件。您可以控制选项卡(组件)和视图。如图所示,如果要更改选项卡布局,则需要提供自己的组件。如果我将选项卡组件设置为JPanel,您可以像控制任何组件一样控制视图的布局(我们将其称为panel1),设置panel1的布局,设置panel1的布局,并添加另一个JPanel(panel2)对于panel1,当我将panel2添加到panel1时,panel2是否具有定义的宽度和高度?也许我应该作为一个单独的问题来问这个问题…听起来像您使用的是空布局。只有当组件所连接的容器使用布局管理器时,才会自动调整组件的大小。同样,如果父组件无效(未连接到具有本机对等的组件,它们将不会调整大小。我如何设置选项卡的布局?当我想到选项卡时,我在概念上认为它是显示另一个组件的东西,例如JPanel,而不是具有布局的东西。这里有3个元素。JTabbedPane管理选项卡和相关组件。选项卡和与选项卡关联的组件。您可以控制选项卡(组件)和视图。如图所示,如果要更改选项卡布局,则需要提供自己的组件。如果我将选项卡组件设置为JPanel,您可以像控制任何组件一样控制视图的布局(我们将其称为panel1),设置panel1的布局,设置panel1的布局,并添加另一个JPanel(panel2)对于panel1,当我将panel2添加到panel1时,panel2是否有一个定义的宽度和高度?也许我应该作为一个单独的问题来问这个问题……这不是完全正确的。是的,
    JTabbedPane
    的首选大小将是添加到它的所有组件中最大的首选大小,但这取决于父容器的布局管理器来确定e选项卡式窗格的实际大小,可能小于首选大小…这是n