Позиционирование в java swing - PullRequest
0 голосов
/ 22 мая 2009

У меня проблемы с позиционированием поля метки / пароля.
С этим кодом они оба располагаются в центре рядом друг с другом, в то время как я на самом деле хочу, чтобы они были в середине моей панели друг над другом.

Кто-нибудь знает, как мне это сделать?

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

public class Paneel_Pincode extends JPanel {


    Paneel_Pincode() {
        setLayout(new FlowLayout());

        JPasswordField pincode = new JPasswordField(15);
        pincode.setLocation(500, 500);
        JLabel pinInvoer = new JLabel();

        ImageIcon pin1 = new ImageIcon("images/voerPincodeIn.jpg");

        pinInvoer.setIcon(pin1);
        pinInvoer.setLocation(500,700);

        add(pincode);
        add(pinInvoer);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(1000,1000);
        f.setLocationRelativeTo(null);

        f.add(new Paneel_Pincode());
        f.setVisible(true);
    }

}

Ответы [ 2 ]

6 голосов
/ 22 мая 2009

Чтобы получить представление о макетах, я бы порекомендовал прочитать о них мою статью (http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/). Это старая версия, но концепции и принципы работы FlowLayout подробно описаны.

Что вы подразумеваете под "друг на друга"?

Если вы имеете в виду, как

   Password
   <field>

РЕДАКТИРОВАТЬ: Я вспомнил более простой способ сделать это (полностью в JDK / JRE) ... (Это похоже на то, что я делаю с BoxBeans ниже, но вам не нужны BoxBeans. Я создал BoxBeans, чтобы давным-давно использовать BoxLayout в построителе пользовательского интерфейса ...)

JLabel label = new JLabel("Password") {
    @Override public Dimension getMaximumSize() {
        return super.getPreferredSize();
    }
};
JPasswordField field = new JPasswordField() {
    @Override public Dimension getMaximumSize() {
        return super.getPreferredSize();
    }
};
field.setColumns(10);
Box verticalBox = Box.createVerticalBox();
verticalBox.add(Box.createVerticalGlue());
verticalBox.add(label);
verticalBox.add(field);
verticalBox.add(Box.createVerticalGlue());
//
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(verticalBox);
horizontalBox.add(Box.createHorizontalGlue());
add(horizontalBox);

Предыдущий ответ для справки ...

Я НЕ РЕКОМЕНДУЮ СЛЕДУЮЩЕГО, НО ЭТО МОЖЕТ ПОМОЧЬ ДРУГИМ ЧИТАТЕЛЯМ ИДЕЯМИ

Вы можете сделать что-то вроде

setLayout(FlowLayout());
JPanel group = new JPanel(new BorderLayout());
group.add(new JLabel("Password"), BorderLayout.NORTH);
group.add(passwordField, BorderLayout.SOUTH);
add(group);

Это создаст небольшую панель в верхнем центре общего пользовательского интерфейса, которая содержит пароль и поле.

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

Если вы также хотите расположить метку / поле по вертикали, вы можете сделать следующее

setLayout(new GridBagLayout());
//
add(new JLabel("Password"), 
    new GridBagConstraints(0,0,1,1,1,1,
        GridBagConstraints.SOUTH,GridBagConstraints.NONE, 
        new Insets(3,3,3,3), 0,0));
field.setColumns(10);
add(field, new GridBagConstraints(0,1,1,1,1,1,
    GridBagConstraints.NORTH,GridBagConstraints.NONE, 
    new Insets(3,3,3,3), 0,0));

Мне вообще не нравится использовать GridBagLayout, поэтому я добавлю версию с помощью BoxLayout (но это немного сложнее из-за предпочтительных настроек размера)

    JFrame f = new JFrame();
    f.setLayout(new BorderLayout());
    //
    JPanel stuffH = new JPanel();
    f.add(stuffH, BorderLayout.CENTER);
    stuffH.setLayout(new BoxLayout(stuffH, BoxLayout.X_AXIS));
    //
    JPanel stuffV = new JPanel();
    stuffV.setLayout(new BoxLayout(stuffV, BoxLayout.Y_AXIS));
    //
    JLabel label = new JLabel("Password");
    BoxAdapter labelAdapter = new BoxAdapter();
    labelAdapter.add(label);
    JPasswordField field = new JPasswordField();
    field.setColumns(10);
    BoxAdapter fieldAdapter = new BoxAdapter();
    fieldAdapter.add(field);
    //
    stuffV.add(new VerticalGlue()); // for vertical spacing
    stuffV.add(labelAdapter);
    stuffV.add(fieldAdapter);
    stuffV.add(new VerticalGlue()); // for vertical spacing
    //
    stuffH.add(new HorizontalGlue()); // for horizontal spacing
    stuffH.add(stuffV);
    stuffH.add(new HorizontalGlue()); // for horizontal spacing
    //
    f.setVisible(true);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Несколько замечаний по этому поводу:

  • Я использую свои вспомогательные классы BoxBeans - см. http://javadude.com/tools/boxbeans. Эта страница основана на VisualAge для Java, но банку внизу страницы можно использовать за пределами VAJ. Я просто попробовал, например, в Eclipse.
  • AFAICS, вы не можете установить макет jframe непосредственно в BoxLayout, поэтому я добавил дополнительную панель между ними. В BoxLayout есть проверка, которая имеет проблемы с автоматическим перенаправлением панели содержимого.
  • Я вложил BoxLayouts, чтобы было горизонтальное центрирование (панель stuffH), содержащее вертикальное центрирование (панель stuffV). Они сосредоточены, окружая их компонентами «Клея», которые являются просто компонентами, которые позволяют себе расширяться.
  • Мне пришлось поместить метку и поле в BoxAdapter, который ограничивает их максимальный размер до их предпочтительного размера. Если вы не хотите использовать BoxAdapter, вы можете добиться того же эффекта, используя следующее для поля и метки:

    JLabel label = new JLabel("Password") {
        @Override public Dimension getMaximumSize() {
            return super.getPreferredSize();
        }
    };
    JPasswordField field = new JPasswordField() {
        @Override public Dimension getMaximumSize() {
            return super.getPreferredSize();
        }
    };
    

Надеюсь, это окажется полезным для вас и всех остальных! - Скотт

1 голос
/ 22 мая 2009

Я бы порекомендовал JGoodies FormLayout. Как только вы изучите его, это будет достаточно мощным и легким для выполнения ручным кодированием.

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