2013-05-13 61 views
1

我在正确使用摆动布局时遇到了问题。摆动布局问题 - JTable和JTree

我想实现类似于screenshot1的东西,但我得到类似screenshot2的东西。

请参阅下面的源代码。

我什么东错了?我怎样才能达到我想要的(如screenshot1)。

注意:当我多次运行代码时,有时会得到表格和树之间的对齐关系。看起来像这里的竞赛条件。

Screenshot1

Screenshot1

Screenshot2
Screenshot2

源代码:

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 
import java.awt.*; 
import java.util.Date; 

public class SwingLayoutTest { 
    private static final int screenWidth; 
    private static final int screenHeight; 

    static { 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     screenWidth = screenSize.width; 
     screenHeight = screenSize.height; 
    } 

    public static void main(String[] args) throws Exception { 
     JFrame mainWindow = new JFrame(); 
     mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWindow.setSize(800, 600); 
     mainWindow.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     Container contentPane = mainWindow.getContentPane(); 
     contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); 
     JTree tree = createTree(); 
     tree.setPreferredSize(new Dimension(screenWidth/2, screenHeight)); 
     JScrollPane scrollTree = new JScrollPane(tree); 
     JTable table = createTable(); 
     table.setPreferredSize(new Dimension(screenWidth/2, screenHeight)); 
     table.getColumnModel().getColumn(1).setWidth(100); 
     table.getColumnModel().getColumn(2).setWidth(100); 
     JScrollPane scrollTable = new JScrollPane(table); 
     JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollTree, scrollTable); 
     contentPane.add(splitPane); 
     mainWindow.setVisible(true); 

    } 

    private static JTree createTree(){ 
     DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("This is root Node"); 
     DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child 1"); 
     rootNode.add(child1); 
     child1.add(new DefaultMutableTreeNode("Child 1 1")); 
     child1.add(new DefaultMutableTreeNode("Child 1 2")); 
     DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child 2"); 
     rootNode.add(child2); 
     child2.add(new DefaultMutableTreeNode("Child 2 1")); 
     child2.add(new DefaultMutableTreeNode("Child 2 2")); 
     return new JTree(rootNode); 
    } 

    private static JTable createTable(){ 
     String[] columnNames = {"Name", "Size", "Modified Time"}; 
     Object[][] data = {{"This is row 1","1000", new Date()}, 
       {"This is row 2", "5455", new Date()}}; 
     return new JTable(data, columnNames); 
    } 
} 
+0

快速浏览后的一个建议:不要使用'setSize()',不要忘记调用'pack()'。事实上,现在就做 - 去掉setSize(),让我们知道发生了什么。 – 2013-05-13 01:30:40

+0

避免使用'setPreferredSize' – MadProgrammer 2013-05-13 01:34:43

+0

@HovercraftFullOfEels,我试着删除mainWindow.setSize()。没有运气,相同的结果! – 2013-05-13 01:40:55

回答

4

Swing Tutorial

要使分隔窗格正常工作,通常需要在拆分窗格中设置组件的最小大小 以及拆分窗格或其包含组件的首选大小 。选择应该设置哪个尺寸是一种艺术,需要了解如何确定窗格的首选大小和分隔符位置。

为什么要将窗口的大小设置为小,然后将组件的大小设置为屏幕的大小?如果你想要看到这么多,为什么不把窗口的大小设置为屏幕的大小呢?

尝试拨打setDividerLocation和/或setResizeWeight并弄乱表/树组件的最小大小。这里没有单一的正确答案。

+0

非常感谢! setSize(screenWidth,screenHeight)和使用setDividerLocation,解决了表树边界的位置。我在这方面有更多问题。表格列的宽度是相等的,我想要最后两列的固定宽度(比如说100像素),第一个取剩下的一个(见代码),这是不光荣的。任何线索? – 2013-05-13 02:01:39

+0

你应该使用'pack()'作为@HovercraftFullOfEels已经评论。这可以让你简单地指定左侧组件(JTree)的首选大小为窗口宽度的一半。这允许SplitPane分割器正确地遵守组件大小,而不是使用'setDividerLocation',如果存在其他大小或布局限制,则不一定有效。对于你的表格宽度,使用'setMaxWidth(100)'而不是'setWidth(100)'。 – KevB 2013-05-13 02:24:24