GridBagLayout: как установить фиксированную ширину столбца?

Я пытался установить фиксированную ширину столбца в следующем коде целую вечность... Дело в том, что когда я добавляю метку на панель слева, ширина автоматически увеличивается... и я хотел бы, чтобы столбец ширина уточняется...

Может ли кто-нибудь помочь мне, пожалуйста??

Это код:

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

import java.io.IOException;

public class CurrentItem extends JPanel{

    private static JFrame currentScreen; 

    public CurrentItem(JFrame p) { 

        GridBagConstraints c = new GridBagConstraints();

        //Borramos todo lo que haya en la pantalla 
        this.removeAll();
        this.revalidate();

        currentScreen = p;     

        this.setBackground(Color.LIGHT_GRAY);      

        this.setLayout(new GridBagLayout());  

        currentScreen.add(this);       

        // --->
        Panel leftPanel = new Panel(); 
        leftPanel.setBackground(Color.BLACK);

        c.weightx = 1.5;
        c.weighty = 1;
        //c.fill = GridBagConstraints.BOTH;      
        this.add(leftPanel, c);
        // <---

        // --->
        Panel secondPanel = new Panel(); 
        secondPanel.setBackground(Color.green);

        c.weightx = 0.25;
        c.weighty = 1;
        c.fill = GridBagConstraints.BOTH;

        this.add(secondPanel, c);
        // <---     

        // --->
        Panel rightPanel = new Panel(); 
        rightPanel.setBackground(Color.CYAN);

        c.weightx = 1.5;
        c.weighty = 1;
        c.fill = GridBagConstraints.BOTH;

        this.add(rightPanel, c);
        // <---

        currentScreen.setVisible(true);

        this.requestFocusInWindow();         
    }
}

person Marie    schedule 16.07.2014    source источник
comment
Не используйте Panel, это компонент AWT. Используйте JPanel, который является компонентом Swing.   -  person camickr    schedule 16.07.2014
comment
Вместо того, чтобы добавлять эти огромные операторы import, вы должны были добавить один метод main, чтобы кто-то мог попробовать его с   -  person nIcE cOw    schedule 16.07.2014


Ответы (2)


GridBagLayout размещает компоненты в прямоугольниках (ячейках) сетки, а затем использует предпочтительные размеры компонентов, чтобы определить размер ячеек.

Веса используются для определения того, как распределять пространство между столбцами (weightx) и между строками (weighty); это важно для указания поведения при изменении размера.

Обычно веса задаются крайними значениями 0,0 и 1,0: числа между ними используются по мере необходимости.

Подробнее Как использовать GridBagLayout


Пример кода: (ниже кода установите столбец фиксированной ширины со 100% размером по вертикали.)

Panel leftPanel = new Panel() {
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};

Удалите weightx для первого столбца и переопределите метод getPreferredSize().

leftPanel.setBackground(Color.BLACK);

c.weighty = 1;
c.fill = GridBagConstraints.VERTICAL;
this.add(leftPanel, c);
person Braj    schedule 16.07.2014

Если вы заранее знаете ярлыки, которые будете добавлять, и ширину каждого из них:

  • Вы можете вызвать label.getPreferredSize().width для каждой метки, чтобы определить ширину самой большой метки.

  • Затем добавьте в столбец невидимый компонент (Box.createHorizontalStrut(width)), чтобы он всегда был такой ширины.

  • Затем, когда вы добавите все свои ярлыки, ширина этого столбца панели не изменится.

person splungebob    schedule 16.07.2014