Установить размер JPanel, если в нем нет компонентов

У меня есть пользовательская JPanel. Единственное, что в нем есть, это рисование прямоугольника, используя drawRect метод Graphics объект. JPanel всегда имеет очень определенный размер квадрата, отказывается становиться больше или меньше. Пытался переопределить getPreferredSize() метод, не работал.

Попытался установить разные менеджеры компоновки для этой пользовательской JPanel, а также попробовал все менеджеры компоновки для JPanel, в которых размещена эта JPanel. Тем не менее, размер пользовательской JPanel остается неизменным.

Как я уже сказал, в пользовательском JPanel нет никаких компонентов, только рисунок прямоугольника.

Есть идеи?

1 ответ

Не зная больше о том, что вы пытаетесь достичь:

  • Что касается вашей панели, вы должны знать, какие менеджеры макета уважают предпочтительные размеры, а какие нет

                              Grid     Flow     Border    Box   GridBag
    Respect PreferredSize      NO       YES      NO       YES     YES
    
  • Это, как говорится, если вы заверните нарисованный JPanel в JPanel с одним из "НЕТ", окрашенным JPanel Шоуд растягивается с изменением размеров рамки.

  • Также, если вы хотите, чтобы нарисованный прямоугольник растягивался вместе с его JPanel, то вам нужно помнить, чтобы нарисовать прямоугольник с getWidth() а также getHeight() из JPanel и не используйте жестко закодированные значения.

Вот пример использования BorderLayout в качестве макета содержащей панели, и с использованием getWidth() а также getHeight() при выполнении картины.

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

public class StretchRect {

    public StretchRect() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new RectanglePanel());

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public class RectanglePanel extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillRect( (int)(getWidth() * 0.1), (int)(getHeight() * 0.1), 
                        (int)(getWidth() * 0.8), (int)(getHeight() * 0.8) );
        }

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

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new StretchRect();
            }
        });
    }
}
Другие вопросы по тегам