Где находится место для установки размера подкомпонентов - PullRequest
0 голосов
/ 05 сентября 2010

У меня расширен класс с JPanel. Этот класс содержит несколько других JComponents и много живописи. То, что я сделал, и я знаю, что это не правильно, я переопределил компонент краски для картин, пока все хорошо.

Но я также установил местоположение и размер для всех подкомпонентов в этом методе, потому что они зависят от getWidth и getHeight от JPanel. Я знаю, что это не место для компонентов, но где я могу делать такие вещи. Во время конструктора размеры не заданы. Так как это исправить? Потому что, пока у меня есть метод location и size в методе paintComponent, процессор никогда не прекращает что-то вычислять.

Редактировать: то, что я сделал, выглядело так;

public class abc extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        /** all the painting stuff */
        textfield.setLocation(
            this.getWidth() * someValue,
            this.getHeight() * someotherValue);
        // also depends on getHeight() and getWidth()
        textfield.setSize(new Dimension(getHeight(), getWidth());
    }
}    

Все работало нормально, за исключением того, что у меня всегда было использование процессора около 10%. Если закомментировать обе строки, загрузка ЦП снизилась до 0%. Так что теперь я использовал Layoutmanager, как вы рекомендовали. И все же все выглядит хорошо, но загрузка процессора не изменилась, но осталась примерно на 10%. Код, как это выглядит сейчас:

public class abc extends JPanel {

    public abc() {
        GridBagLayout gblayout = new GridBagLayout();

        this.setLayout(gblayout);

        textfield = new JTextField();
        textfield.setHorizontalAlignment(JTextField.CENTER);
        textfield.setBackground(new Color(0, 0, 0, 0));
        textfield.setBorder(null);
        textfield.setText("0");

        gblayout.setConstraints(textfield, new GridBagConstraints(
            0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER,
            GridBagConstraints.BOTH, new Insets(4, 4, 4, 4), 1, 1));

        this.add(textfield);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        /** still the same paintings */ }
}

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Размер и положение компонентов устанавливаются менеджером макета. После инициализации кадра вызывается pack () для настройки размера всех компонентов.

Сначала необходимо установить минимальное, максимальное ипредпочтительный размер, и пусть менеджер по расположению сделает свою работу.Вы можете получить ширину и высоту компонента в paintComponent (), чтобы отобразить его в соответствии с его размером.

1 голос
/ 06 сентября 2010

Это действительно поможет, если вы покажете нам некоторый код и, возможно, объясните, что вы пытаетесь сделать, но, насколько я понимаю, вы пытаетесь сделать слишком много в одной JPanel.У вас должна быть отдельная панель, которая переопределяет paintComponent (), если вы собираетесь рисовать на ней и т. Д., И еще одну (или более) для хранения других ваших компонентов.

Очень трудно, фактически, почти невозможно изменить размеры отдельных компонентов, потому что они должны подчиняться макету, выбранному для их родительского компонента (обычно JPanel), так что вы также должны помнить об этом.

...