Невозможно изменить размер JButton - PullRequest
0 голосов
/ 24 декабря 2009

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

class ControlFrame extends JFrame 
    implements Runnable
{
    JButton jb_inc = new JButton();
    JButton jb_zero = new JButton();
    JButton jb_dec = new JButton();

    ControlFrame() {
        super("Control Frame");
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    ControlFrame(int x,int y, int w, int h) {
        this();
        this.setBounds(x, y, w, h);
        this.setVisible(true);

        jb_inc.setBounds(10,10,90,20);
        jb_zero.setBounds(10,40,90,20);
        jb_dec.setBounds(10,60,90,20);

        jb_inc.setVisible(true);
        jb_zero.setVisible(true);
        jb_dec.setVisible(true);

        this.getContentPane().add(jb_inc);
        this.getContentPane().add(jb_zero);
        this.getContentPane().add(jb_dec);

    }

    public void run() {
    }
}

public class Counting_Machine 
{
    public static void main(String[] args) {
        ControlFrame cf = new ControlFrame(0,200,80,150);
    }
}

Ответы [ 3 ]

2 голосов
/ 24 декабря 2009

Я предлагаю вам начать с чтения раздела из учебника по Swing по Использование менеджеров по макету Ваш код не будет работать, потому что вы пытаетесь добавить 3 компонента в «центр» BorderLayout, который выиграл т работа. Выберите LayoutManager, который лучше соответствует вашим потребностям.

Нет необходимости использовать метод setBounds (...) при использовании менеджера макета. Работа менеджера по расположению состоит в том, чтобы расположить компоненты на основе правил менеджера по расположению. Предпочтительный размер каждой кнопки должен быть одинаковым, поскольку вы не добавили к ним никакого текста.

Также нет необходимости вызывать setVisible () для кнопок, по умолчанию все компоненты Swing видимы, кроме контейнеров верхнего уровня (JFrame, JDialog).

0 голосов
/ 24 декабря 2009

Поскольку вы устанавливаете границы для всего, вам вообще не нужен LayoutManager. Установите для LayoutManager значение NULL, тогда вы можете расположить все самостоятельно, как в своем примере.

this.setLayoutManager(null)
0 голосов
/ 24 декабря 2009

Два предложения:

1) положить общие вещи в блок инициализации экземпляра. Лично я содрогаюсь всякий раз, когда вижу вызов "this ()".

{ this.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE); }

ControlFrame () { супер («Контрольная рамка»); }

ControlFrame (int x, int y, int w, int h) { супер («Контрольная рамка»); ... }

2) Я бы избавился от конструктора x, y, w, h ... лично у меня есть класс WindowUtils, у которого есть метод "position", который вычисляет размер экрана и затем использует значения, переданные в создайте окно, которое является относительным размером экрана. Тогда код, который создает окно, вызывает это. Я предпочитаю иметь как можно меньше конструкторов (очень часто это ноль или один, у меня почти никогда не бывает двух или более).

3) this.getContentPane (). Add (jb_inc); теперь можно записать как add (jb_inc); - начиная с JDK 1.5, я думаю.

4) никогда не вызывайте переопределяемые методы (все, что у вас было раньше) внутри конструктора. Если подкласс переопределит «добавить», вы можете увидеть, что все сломается. Таким образом, вы можете вызвать super.add (), или добавить в другой метод, или сделать ваш класс окончательным.

Теперь, чтобы ответить на ваш вопрос ...: -)

Вам нужно использовать LayoutManagers , чтобы получить то, что вы хотите.

В зависимости от того, что вы хотите, вы, вероятно, захотите использовать BorderLayout, чтобы вы могли получить кнопку внизу.

...