JPanel не будет изменять размер - PullRequest
1 голос
/ 29 ноября 2010

Мой код:

public MyConstructor() {
    view = new JPanel(new GridLayout(3, 1));
    header = new JPanel(new GridLayout(2, 1));//2 ROWS 1 COLUMN
    foot = new JLabel("Copyright...");
    content = new JPanel();
    info = new JLabel("");
    logo = new JLabel() {

        BufferedImage img;

        @Override
        public void paint(Graphics g) {
            try {
                img = ImageIO.read(new File("logo.jpg"));
            } catch (IOException e) {
            }
            g.drawImage(img, 0, 0, null);
        }
    };
    window.add(view);
    header.add(logo);
    header.add(info);
    view.add(header);
    view.add(content);
    view.add(foot);
    window.setLocation(width / 2, 100);
   window.setSize(width, height);
    window.setPreferredSize(new Dimension(width, height));
    content.setSize(window.getWidth(), height-70);
    content.setPreferredSize(new Dimension(window.getWidth(), height-70));
}

"окно" - это фрейм ... класс не расширяет JFrame Мой класс будет суперклассом для других, подклассы наследуют общедоступный контент JPanel. В моем суперклассе я пытаюсь установить ширину и высоту 3 секций моего GridLayout, компоненты логотипа и информации добавляют до 70 для их высоты ... Я установил другие компоненты (вид, заголовок, информация , logo) private, чтобы подклассы не могли получить к ним доступ ...

Когда приложение запускается, отображается окно для входа в систему, оно отображается и корректно изменяет размер. После входа в систему в экземпляре одного из подклассов окно входа затем скрывается. setVisible (false)

когда отображается новое окно, JFrame имеет правильный размер, но заголовок, содержимое и нижний колонтитул не являются точными размерами. Я попытался установить размер и предпочтительный размер каждого из компонентов, но все еще не работает ... Я также попытался вызвать перерисовку и проверку / повторную проверку

Есть идеи?

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Почему вы переопределяете метку для рисования изображения?

  1. . Это метод setIcon () для
  2. , вы никогда не должны читать файл в пользовательском коде рисованиятак как этот метод вызывается несколько раз
  3. пользовательское рисование при необходимости выполняется в методе paintComponent ().
1 голос
/ 29 ноября 2010

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

На самом деле, почему бы просто не создать классы верхнего и нижнего колонтитула и повторно использовать их вместо того, чтобы создавать подклассы фрейма только для того, чтобы получить одинаковые верхний и нижний колонтитулы?

0 голосов
/ 29 ноября 2010

Попробуйте установить предпочтительные размеры, прежде чем добавлять компоненты в контейнеры и добавлять компоненты «снизу вверх». В противном случае попробуйте позвонить pack(), revalidate(), repaint() и т. Д., Чтобы все настроить.

Читайте также и о Layout Managers, вы их не правильно используете.

Также Свинг - отстой. Попробуйте NetBeans, это делает его немного более терпимым. Это очень помогает, когда вам нужно вручную размещать и изменять размер вещей.

...