2014-12-08 2 views
1

Я пытаюсь изменить размер JPanels, но под ним есть пробел. Вот ссылка на шоу:Как изменить размер JPanel

enter image description here

And this is the code : 


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

public class Ex1 extends JFrame{ 
private JTextArea textarea = new JTextArea(); 
private JTextField field = new JTextField();`` 
private JButton buton = new JButton ("Trimite"); 

public Ex1(){ 
    JPanel panel = new JPanel (new BorderLayout(2,2)); 
    JPanel panel1 = new JPanel (new BorderLayout(2,2)); 
    JPanel panel2 = new JPanel (new BorderLayout(2,2)); 
    JLabel label1 = new JLabel ("Mesaje"); 
    JLabel label2 = new JLabel ("Scrieti un mesaj"); 
    panel1.setPreferredSize(new Dimension(350,100)); 
    panel2.setPreferredSize(new Dimension(350,25)); 
    panel1.add(label1, BorderLayout.NORTH); 
    panel1.add(textarea, BorderLayout.CENTER); 
    panel2.add(label2, BorderLayout.WEST); 
    panel2.add(field, BorderLayout.CENTER); 
    panel2.add(buton, BorderLayout.EAST); 
    setLayout(new GridLayout(2,1,1,1)); 
    panel.add(panel1, BorderLayout.NORTH); 
    panel.add(panel2, BorderLayout.CENTER); 
    add(panel); 

} 

public static void main(String[] args) { 
    JFrame frame = new Ex1(); 
    frame.pack(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

}

+0

Это рамка не панель. измените размер кадра –

+0

, если у вас есть достаточно времени и у вас есть терпение ... один подход заключается в использовании абсолютного макета (к очень маленькому проекту ...) ... у него больше времени на вас ... но вы можете организовать каждый компонент в абсолютном положении и размере, который вы хотите ..! :-) – mehdi

ответ

4

Вы устанавливаете макет для кадра GridLayout, в котором все компоненты имеют равный размер. У вас есть две строки: add(panel) добавляет панель в первую строку сетки. Вторая строка остается пустой. См. How to Use GridLayout.

Комментарий setLayout(new GridLayout(2,1,1,1)); и дополнительное пространство должно уйти. Когда вы прокомментируете эту строку, макет панели содержимого кадра будет BorderLayout. Раскладка по умолчанию для JFrame: BorderLayout. Таким образом, add(panel); добавит панель в центр области содержимого фрейма. В результате панель должна занимать все свободное место.

В качестве примечания стороны, избегайте setPreferredSize(), как правило, не нужно, см. Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing для деталей.

Вы можете указать количество строк и столбцов для ввода текста и завернуть его в панели прокрутки, то есть:

textArea = new JTextArea(5, 20); 
JScrollPane scrollPane = new JScrollPane(textArea); 

Для получения более подробной информации см How to Use Text Areas

EDIT: пример GetPreferredSize ()

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.*; 

public class Ex1 extends JPanel{ 
    private JTextArea textarea = new JTextArea(); 
    private JTextField field = new JTextField(); 
    private JButton buton = new JButton ("Trimite"); 

    public Ex1() { 
     setLayout(new BorderLayout()); 

     JPanel panel1 = new JPanel (new BorderLayout(2,2)); 
     JPanel panel2 = new JPanel (new BorderLayout(2,2)); 

     JLabel label1 = new JLabel ("Mesaje"); 
     JLabel label2 = new JLabel ("Scrieti un mesaj"); 

     panel1.add(label1, BorderLayout.NORTH); 
     panel1.add(new JScrollPane(textarea), BorderLayout.CENTER); 

     panel2.add(label2, BorderLayout.WEST); 
     panel2.add(field, BorderLayout.CENTER); 
     panel2.add(buton, BorderLayout.EAST); 

     add(panel1, BorderLayout.CENTER); 
     add(panel2, BorderLayout.SOUTH); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(350, 300); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("Test"); 

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationByPlatform(true); 

       Ex1 panel = new Ex1(); 

       frame.add(panel); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+1

Спасибо! Действительно полезно – Angelo

+0

@ Ангело приветствуем вас! Я рад, что это помогло :) – tenorsax

+0

Еще один вопрос: если я хочу, чтобы размер кадра составлял 350 х 300, то отображается только первая панель :-( – Angelo

0

Вы должны изменить размер JFrame не JPanel. Попробуйте:

this.setPreferredSize(new Dimension(350, 25);// in Ex1 

Или в основном методе:

frame.setPreferredSize(new Dimension(350, 25); 
+0

Попробуйте использовать setbounds для сброса размера окна –

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