Добавьте JTextField в JToolBar

Я пытаюсь добавить JTextField к JToolBar, и это работает, но это слишком долго. Мне нужно, чтобы он принимал только 3 буквы.

Вот его скриншот... screenshot

Я пробовал следующие методы,

JTextField field = new JextField(3); // thought this limits to three characters.

И я пытался,

field.setColumns(3); // this didn't work either.

person Isuru Madusanka    schedule 05.06.2012    source источник
comment
Интересный. :) На Nimbus L&F вы получаете обратное поведение - текстовое поле всегда имеет предпочтительный размер, и его трудно увеличить.   -  person Trejkaz    schedule 28.02.2014


Ответы (2)


Компоновка панели инструментов по умолчанию соответствует максимальному размеру, установленному для текстового поля.

Текстовое поле на панели инструментов

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

public class TextFieldInToolBar {

    TextFieldInToolBar() {
        JPanel p = new JPanel(new BorderLayout());

        JToolBar tb = new JToolBar();
        p.add(tb, BorderLayout.PAGE_START);

        Icon disk = (Icon)UIManager.get("FileView.floppyDriveIcon"); 
        Icon pc = (Icon)UIManager.get("FileView.computerIcon"); 
        tb.add(new JButton(disk));
        JTextField tf = new JTextField(3);
        tf.setMaximumSize(tf.getPreferredSize());
        tb.add(tf);
        tb.addSeparator();
        tb.add(new JButton(pc));

        p.setPreferredSize(new Dimension(250,50));

        JOptionPane.showMessageDialog(null, p);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TextFieldInToolBar();
            }
        });
    }
}
person Andrew Thompson    schedule 05.06.2012
comment
на сегодня нет голосов Я тоже! но зачем возиться с JToolBar Почему бы и нет? Мне скучно, и я хотел посмотреть, может ли это быть таким же простым, как установка максимального размера. ;) - person Andrew Thompson; 05.06.2012
comment
без обид, но я видел проблему с направлением высоты, почему бы не использовать FlowLayout / BoxLayout напрямую - person mKorbel; 05.06.2012
comment
Вау, это здорово. Он вроде чище, чем предыдущий. - person Isuru Madusanka; 05.06.2012
comment
Я за забастовку (убедите Джона и милое животное тоже) две недели без голосов в постах с тегами Swing, это будет еще одна шутка, хе-хе-хе - person mKorbel; 06.06.2012
comment
Если вы хотите, чтобы максимальный размер всегда совпадал с предпочтительным размером, вы должны расширить JTextField и переопределить getMaximumSize(). Если вы этого не сделаете, Swing подумает, что вы устанавливаете максимальный размер явно, и даже если предпочтительный размер изменится позже, не будет обновлять максимальный размер для соответствия. Другой способ сделать это - обработать его в вашем методе updateUI() из какого-либо другого компонента. - person Trejkaz; 28.02.2014
comment
@Trejkaz Да, это хороший момент, чтобы переопределить, а не установить. Я мог бы обновить источник. См. также Следует ли избегать использования методов set(Preferred|Maximum|Minimum)Size в Java Swing? (Да.) - person Andrew Thompson; 28.02.2014

person mKorbel    schedule 05.06.2012
comment
Спасибо, а есть ли какое-то решение, ссылка на второй пункт показывает, что решения нет. - person Isuru Madusanka; 05.06.2012
comment
Преимущество использования JToolBar в пристыкованном контейнере, но это для меня dis_advantate и выглядит очень некрасиво - person mKorbel; 05.06.2012
comment
Итак, вы предлагаете использовать JMenuBar, у меня уже есть одна строка меню, не проблема ли это? - person Isuru Madusanka; 05.06.2012
comment
нет, вы можете поместить еще один JMenuBar в область NORTH в JFrame (например) или в JPanel, например. - person mKorbel; 05.06.2012
comment
Я решил аналогичную проблему, поместив три JPanel (setOpaque (false)) влево и вправо, используя центр JPanel GridLayout (JTextField и JLabel) с помощью BorderLayout, - person mKorbel; 05.06.2012