2017-07-25 79 views
0

我已经创建了一个简单的Swing应用程序,它目前由一个JToolBar,一个JTree和一个RSyntaxTextArea组成,全都在GridBagLayout内。扩展JTree的节点最小化GridBagLayout

JTree目前只有一个顶级节点,并且只有一个子节点。 Complete UI with JToolBar, JTree and RSyntaxTextArea 与JToolBar中,JTree的和RSyntaxTextArea完整的UI

当扩大JTree的顶部节点,整个的GridBagLayout一种 “最小化” 的: The UI after expanding the top node of the JTree.

我GOOGLE了这个phenominum,但由于控制台中没有错误信息或其他信息,我现在很无助。

我用下面的代码来创建用户界面:

RSyntaxTextArea textArea = new RSyntaxTextArea(50, 150); 
textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); 
textArea.setCodeFoldingEnabled(true); 
RTextScrollPane sp = new RTextScrollPane(textArea); 

cp.setLayout(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 
c.fill = GridBagConstraints.HORIZONTAL; 

c.gridx = 0; 
c.gridy = 0; 
cp.add(createToolbar(), c); 

c.gridx = 0; 
c.gridy = 1; 
c.ipadx = 90; 
c.fill = GridBagConstraints.BOTH; 
cp.add(createTree(), c); 

c.gridx = 1; 
c.gridy = 1; 
c.fill = GridBagConstraints.HORIZONTAL; 
cp.add(sp, c); 

... 

private JToolBar createToolbar() { 
    JToolBar tb = new JToolBar("Toolbar", JToolBar.HORIZONTAL); 

    JButton ob = new JButton(new ImageIcon("...")); 

    tb.add(ob); 

    tb.setFloatable(false); 
    tb.setRollover(true); 

    return tb; 
} 

... 

private JTree createTree() { 
    DefaultMutableTreeNode top = new DefaultMutableTreeNode("Projects"); 
    JTree tree = new JTree(top); 

    DefaultMutableTreeNode test = new DefaultMutableTreeNode("I'm a test!"); 
    top.add(test); 

    return tree; 
} 

更新:一个最小的代码示例来编译你的系统上测试目的:

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JToolBar; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class Tester extends JFrame { 

    public Tester() { 
     initializeComponent(); 
    } 

    private void initializeComponent() { 
     JPanel cp = new JPanel(new BorderLayout()); 
     JTextArea textArea = new JTextArea(50, 150); 
     JScrollPane sp = new JScrollPane(textArea); 
     cp.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 0; 
     c.gridy = 0; 
     cp.add(createToolbar(), c); 
     c.gridx = 0; 
     c.gridy = 1; 
     c.ipadx = 90; 
     c.fill = GridBagConstraints.BOTH; 
     cp.add(createTree(), c); 
     c.gridx = 1; 
     c.gridy = 1; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     cp.add(sp, c); 
     setContentPane(cp); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
    } 

    private JTree createTree() { 
     DefaultMutableTreeNode top = new DefaultMutableTreeNode("Projects"); 
     JTree tree = new JTree(top); 
     DefaultMutableTreeNode test = new DefaultMutableTreeNode("I'm a test!"); 
     top.add(test); 
     return tree; 
    } 

    private JToolBar createToolbar() { 
     JToolBar tb = new JToolBar("Toolbar", JToolBar.HORIZONTAL); 
     JButton ob = new JButton("Button"); 
     tb.add(ob); 
     tb.setFloatable(false); 
     tb.setRollover(true); 
     return tb; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Tester().setVisible(true); 
      } 
     }); 
    } 

} 
+0

请考虑在您的问题中创建并发布一个有效的[mcve] ***小***程序,我们可以编译,运行,并为我们演示您的问题。 –

+0

@HovercraftFullOfEels当然,更新了我的问题。 –

+0

(1-)@AlexanderLeithner,您发布的代码不是'MCVE',因为我们无法访问自定义类。无论如何,你已经有了你的答案。有时间做一些阅读。 – camickr

回答

2

扩展JTree的顶层节点时,整个GridBagLayout类型的“最小化”:

的GridBagLayout的会缩小到一个部件的最小尺寸时,没有足够的空间来显示整个构件。

当前由JToolBar,JTree和RSyntaxTextArea组成的Swing应用程序,全都在GridBagLayout中。

我只想用默认帧的BorderLayout

add(toolbar, BorderLayout.PAGE_START); 
add(treeScrollPane, BorderLayout.CENTER); 
add(textAreaScrollPane, BorderLayout.PAGE_END); 

注意我如何加入到JTree的JScrollPane中。现在滚动条将在需要时出现在树上。

如果您确实想使用GridBagLayout,请参阅Swing教程中关于How to Use GridBagLayout的部分,以获取有关如何使用各种约束的说明。您可能希望从“weightx/y”约束开始,该约束控制在更改帧大小时哪些组件获得空间。另外,看看“填充”约束。

+0

这会将RSyntaxTextArea附加到对话框的末尾,对吧?这不是我希望它显示的方式,就在它右侧的JTree旁边。但有关收缩的好消息(但我真的不知道为什么应该没有足够的空间)... –

+0

@AlexanderLeithner,'我想让它显示出来,就在右边的JTree旁边 - - 然后使用不同的BorderLayout约束将文本区域放在右边。阅读教程。我提供了一个到GridBagLayout的链接。你还会在BorderLayout上找到一个部分。 – camickr

+0

谢谢,忽略'weightx/y'(但之前阅读过本教程)...... –