2015-04-06 38 views
0

我碰到一个轻微的错误从我的主GUI类中提取出的代码高额部分并把它们分成更小的管理类时就来了。的JPanel和扩展的JPanel自定义类不能正确显示

所以我做了另外一个测试用一个非常简单的GUI和发现,同样的错误有发生,即使唯一的区别是,该代码是在不同的位置。

第一JPanel的正确显示和填充整个布局。 扩展JPanel的第二个TestPanel无法正确显示并填充了布局的一小部分。

The working JPanel containing JScrollPane with a JTextArea in it's viewport The non working JPanel containing JScrollPane with a JTextArea in it's viewport

两个类都有完全相同的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; 
    } 
} 

回答

2
notWorkingExtendingJPanel.setLayout(gbl_panel_1); 

我猜问题是,你不能设置后,您的组件添加到面板上的布局。

上面的语句和所有的网格包布局的逻辑应该是你TestJPanel类用于创建和组件添加到面板上。

+0

问题解决了。不知道设置面板布局的顺序影响了内部组件。 –

+0

@jordandap,布局管理器,不是面板,管理约束。如果在添加组件后更改布局管理器,则必须使用'LayoutMmanager2'接口的'addLayoutComponent(...)'方法手动添加约束。或者,正如我已经建议的那样,更简单的方法是在添加组件之前设置布局管理器。 – camickr