2014-02-11 50 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的差異。下次記住這一點;) –

相關問題