2014-02-11 3 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; 
} 

Без этого кода, фрейм выглядит нормально, но когда я добавляю его, он добавляет большое количество пустого пространства под эти двух кнопками. Почему это происходит?

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

Нам нужно увидеть, где вы добавляете 'JPanel' в' JFrame'. Ничто здесь не могло бы вызвать постороннего пространства. За исключением, может быть, того факта, что вы добавляете кнопки дважды: один раз в «JPanel» и один раз в «JFrame» (который ничего не должен делать, поскольку «JFrame» в основном пустой, невидимый контейнер). – asteri

ответ

1

"Я хочу, чтобы избавиться от дополнительного пространства под ОК и закройте кнопки."

Проблема: вы используете GridLayout, что сделает все JPanel равным. То, что вы должны сделать вместо этого обернуть первые четыре JPanel в GridLayout, то оставьте значение по умолчанию BorderLayout в JFrame, добавьте JPanel к BorderLayout.CENTER из JFrame и добавят кнопку JPanel к 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. Имейте это в виду в следующий раз;) –

Смежные вопросы