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