2014-02-11 94 views
2

所以我将这段代码添加到其中有其他布局管理器和组件的JFrame中。为什么额外的空间被添加到框架?

private JPanel testing123() { 
    JPanel j = new JPanel(new FlowLayout()); 
    jbtOk = new JButton("OK"); 
    jbtOk.setMnemonic('K'); 
    jbtExit = new JButton("Exit"); 
    jbtExit.setMnemonic('x'); 

    add(jbtOk); 
    add(jbtExit); 
    j.add(jbtOk); 
    j.add(jbtExit); 
    return j; 
} 

没有这个代码,JFrame中看起来不错,但是当我添加它,这下这两个按钮添加了大量的空的空间。这是为什么发生?

enter image description here

此复制它:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.border.TitledBorder; 

public class Test extends JFrame implements ActionListener, KeyListener { 

JButton jbtOk, jbtExit; 

JPanel p = new JPanel(new GridLayout(0,1)); 
JPanel gui = new JPanel(new BorderLayout(2,2)); 

public Test() { 

    super("t"); 
    //setSize(300,300); 
    setVisible(true); 
    JPanel test = test(); 
    JPanel testing = testing(); 
    JPanel testing123 = testing123(); 
    p.add(test); 
    p.add(testing); 
    p.add(testing123); 
    this.getContentPane().add(p); 
    pack(); 
} 

private JPanel test() { 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel labelFields = new JPanel(new BorderLayout(2,2)); 
    labelFields.setBorder(new TitledBorder("m")); 
    p.add(gui); 
    p.add(labelFields); 
    JPanel labels = new JPanel(new GridLayout(0,1,1,1)); 
    labels.setBorder(new TitledBorder("a")); 
    JPanel fields = new JPanel(new GridLayout(0,1,1,1)); 
    fields.setBorder(new TitledBorder("b")); 

    p.add(labels); 
    p.add(fields); 
    add(fields); 
    add(p); 
    return gui; 
} 

private JPanel testing() { 
    JPanel guiCenter = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
    guiCenter.setBorder(new TitledBorder("n")); 
    guiCenter.add(new JScrollPane(new JTextArea(5,30))); 
    gui.add(guiCenter, BorderLayout.CENTER); 
    return guiCenter; 
} 

private JPanel testing123() { 
    JPanel j = new JPanel(new FlowLayout()); 
    jbtOk = new JButton("OK"); 
    jbtOk.setMnemonic('K'); 
    jbtExit = new JButton("Exit"); 
    jbtExit.setMnemonic('x'); 

    //add(jbtOk); 
    //add(jbtExit); 
    j.add(jbtOk); 
    j.add(jbtExit); 
    return j; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 
} 
+6

A [MCVE(https://stackoverflow.com/help/mcve)将大有帮助了解你的问题... – MadProgrammer

+1

你的含义* *大量的空白空间*也许有帮助 –

+0

我们需要看看你在'JFrame'中添加'JPanel'的位置。这里什么都不会造成额外的空间。除了你添加按钮两次:一次到'JPanel',一次到'JFrame'(它不应该做什么,因为JFrame基本上是一个空的,不可见的容器)。 – asteri

回答

1

“我想下确定和退出按钮摆脱多余的空间。”

问题是您正在使用的GridLayout将使所有JPanel大小相等。你应该做的却是包裹前四JPanelGridLayout,然后保持JFrame默认BorderLayout,添加JPanelJFrameBorderLayout.CENTERJPanel添加按钮到BorderLayout.PAGE_END。这应该解决的问题

public Test() { 

    super("t"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    JPanel test = test(); 
    JPanel testing = testing(); 
    JPanel testing123 = testing123(); 
    p.add(test); 
    p.add(testing); 
    add(p, BorderLayout.CENTER);    <--- 
    add(testing123, BorderLayout.PAGE_END); <--- 
    pack(); 
    setVisible(true); 
} 

enter image description here

完整的运行代码

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.TitledBorder; 

public class Test extends JFrame { 

    JButton jbtOk, jbtExit; 

    JPanel p = new JPanel(new GridLayout(0, 1)); 
    JPanel gui = new JPanel(new BorderLayout(2, 2)); 

    public Test() { 

     super("t"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JPanel test = test(); 
     JPanel testing = testing(); 
     JPanel testing123 = testing123(); 
     p.add(test); 
     p.add(testing); 
     add(p, BorderLayout.CENTER); 
     add(testing123, BorderLayout.PAGE_END); 
     pack(); 
     setVisible(true); 
    } 

    private JPanel test() { 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel labelFields = new JPanel(new BorderLayout(2, 2)); 
     labelFields.setBorder(new TitledBorder("m")); 
     p.add(gui); 
     p.add(labelFields); 
     JPanel labels = new JPanel(new GridLayout(0, 1, 1, 1)); 
     labels.setBorder(new TitledBorder("a")); 
     JPanel fields = new JPanel(new GridLayout(0, 1, 1, 1)); 
     fields.setBorder(new TitledBorder("b")); 

     p.add(labels); 
     p.add(fields); 
     return gui; 
    } 

    private JPanel testing() { 
     JPanel guiCenter = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     guiCenter.setBorder(new TitledBorder("n")); 
     guiCenter.add(new JScrollPane(new JTextArea(5, 30))); 
     gui.add(guiCenter, BorderLayout.CENTER); 
     return guiCenter; 
    } 

    private JPanel testing123() { 
     JPanel j = new JPanel(new FlowLayout()); 
     jbtOk = new JButton("OK"); 
     jbtOk.setMnemonic('K'); 
     jbtExit = new JButton("Exit"); 
     jbtExit.setMnemonic('x'); 

     j.add(jbtOk); 
     j.add(jbtExit); 

     return j; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 
} 
+0

非常感谢!我有这么难的时候,我真的很感谢你的帮助! – user2022185

+1

查看MCTRE的差异。下次记住这一点;) –

相关问题