0
我碰到一个轻微的错误从我的主GUI类中提取出的代码高额部分并把它们分成更小的管理类时就来了。的JPanel和扩展的JPanel自定义类不能正确显示
所以我做了另外一个测试用一个非常简单的GUI和发现,同样的错误有发生,即使唯一的区别是,该代码是在不同的位置。
第一JPanel的正确显示和填充整个布局。 扩展JPanel的第二个TestPanel无法正确显示并填充了布局的一小部分。
两个类都有完全相同的GridBagLayout和两个JScrollPanes具有相同的GridBagConstraints。
这是我用含含每一个JScrollPane的有一个JTextArea在它的视窗2个JPanels的JTabbedPane的主类。
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JScrollPane;
import java.awt.GridBagConstraints;
import javax.swing.JTextArea;
public class TestMainGUI
{
private JFrame frame;
private JTabbedPane tabbedPane;
private JPanel workingDefaultPanel;
private JScrollPane workingDefaultScrollPane;
private JTextArea workingDefaultJTextArea;
private TestJPanel notWorkingExtendingJPanel;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
try
{
TestMainGUI window = new TestMainGUI();
window.frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
public TestMainGUI()
{
initialize();
}
private void initialize()
{
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//******************************************************************//
tabbedPane = new JTabbedPane(SwingConstants.TOP);
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
//******************************************************************//
workingDefaultPanel = new JPanel();
tabbedPane.addTab("Working Panel", null, workingDefaultPanel, null);
GridBagLayout gbl_WorkingDefaultPanel = new GridBagLayout();
gbl_WorkingDefaultPanel.columnWidths = new int[]{0, 0};
gbl_WorkingDefaultPanel.rowHeights = new int[]{0, 0};
gbl_WorkingDefaultPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gbl_WorkingDefaultPanel.rowWeights = new double[]{1.0, Double.MIN_VALUE};
workingDefaultPanel.setLayout(gbl_WorkingDefaultPanel);
//******************************************************************//
workingDefaultScrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 0;
workingDefaultPanel.add(workingDefaultScrollPane, gbc_scrollPane);
//******************************************************************//
workingDefaultJTextArea = new JTextArea();
workingDefaultScrollPane.setViewportView(workingDefaultJTextArea);
//******************************************************************//
notWorkingExtendingJPanel = new TestJPanel();
tabbedPane.addTab("Non Working Panel", null, notWorkingExtendingJPanel, null);
GridBagLayout gbl_panel_1 = new GridBagLayout();
gbl_panel_1.columnWidths = new int[]{0, 0};
gbl_panel_1.rowHeights = new int[]{0, 0};
gbl_panel_1.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gbl_panel_1.rowWeights = new double[]{1.0, Double.MIN_VALUE};
notWorkingExtendingJPanel.setLayout(gbl_panel_1);
}
}
,这里是我的TestJPanel
import java.awt.GridBagConstraints;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class TestJPanel extends JPanel
{
private static final long serialVersionUID = 5041143050449865233L;
private JScrollPane notWorkingJScrollPane;
private JTextArea notWorkingJTextArea;
public TestJPanel()
{
super();
notWorkingJScrollPane = new JScrollPane();
GridBagConstraints gbc_notWorkingScrollPane = new GridBagConstraints();
gbc_notWorkingScrollPane.fill = GridBagConstraints.BOTH;
gbc_notWorkingScrollPane.gridx = 0;
gbc_notWorkingScrollPane.gridy = 0;
this.add(notWorkingJScrollPane, gbc_notWorkingScrollPane);
//******************************************************************//
notWorkingJTextArea = new JTextArea();
notWorkingJScrollPane.setViewportView(notWorkingJTextArea);
}
protected JScrollPane getNotWorkingJScrollPane()
{
return notWorkingJScrollPane;
}
protected JTextArea getNotWorkingJTextArea()
{
return notWorkingJTextArea;
}
}
问题解决了。不知道设置面板布局的顺序影响了内部组件。 –
@jordandap,布局管理器,不是面板,管理约束。如果在添加组件后更改布局管理器,则必须使用'LayoutMmanager2'接口的'addLayoutComponent(...)'方法手动添加约束。或者,正如我已经建议的那样,更简单的方法是在添加组件之前设置布局管理器。 – camickr