Как помещать текстовые поля и кнопки друг под друга? [Дубликат]

Поле, аннотированное @Autowired, является null, потому что Spring не знает о копии MileageFeeCalculator, которую вы создали с помощью new, и не знал, чтобы ее автоустанавливать.

Контейнер Spring Inversion of Control (IoC) имеет три основных логических компонента: реестр (называемый ApplicationContext) компонентов (beans), доступных для использования приложением, система настройки, которая вводит объектов в них путем сопоставления зависимостей с компонентами в контексте и решателя зависимостей, которые могут смотреть на конфигурацию множества различных компонентов и определять, как создавать и настраивать их в необходимом порядке.

Контейнер IoC не является волшебным, и он не может знать о Java-объектах, если вы как-то не сообщаете об этом. Когда вы вызываете new, JVM создает экземпляр нового объекта и передает его прямо вам - он никогда не проходит процесс настройки. Есть три способа, которыми вы можете настроить свои компоненты.

Я опубликовал весь этот код, используя Spring Boot для запуска, в проекте GitHub ; вы можете посмотреть полный рабочий проект для каждого подхода, чтобы увидеть все, что вам нужно, чтобы заставить его работать. Тег с параметром NullPointerException: nonworking

Ввод ваших bean-компонентов

Наиболее предпочтительным вариантом является позволить Spring autowire все ваши компоненты; это требует наименьшего количества кода и является наиболее удобным для обслуживания. Чтобы сделать работу по автоустановке, как вы хотели, также автоустанавливайте MileageFeeCalculator следующим образом:

@Controller
public class MileageFeeController {

    @Autowired
    private MileageFeeCalculator calc;

    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        return calc.mileageCharge(miles);
    }
}

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

Тег, который работает путем ввода объекта службы @MileageFeeCalculator: working-inject-bean

Использовать @Configurable

Если вам действительно нужны объекты, созданные с new, которые будут автообновлены, вы можете использовать аннотацию Spring @Configurable вместе с AspectJ компиляцией во время компиляции для ввода ваших объектов , Этот подход вставляет код в конструктор вашего объекта, который предупреждает Spring о том, что он создается, так что Spring может настроить новый экземпляр. Это требует некоторой конфигурации в вашей сборке (например, компиляции с ajc) и включения обработчиков конфигурации среды Spring (@EnableSpringConfigured с синтаксисом JavaConfig). Этот подход используется системой активных записей Roo, чтобы позволить экземплярам new ваших объектов получать необходимую информацию о сохранении.

@Service
@Configurable
public class MileageFeeCalculator {

    @Autowired
    private MileageRateService rateService;

    public float mileageCharge(final int miles) {
        return (miles * rateService.ratePerMile());
    }
}

Тег, который работает с помощью @Configurable на объекте службы: working-configurable

Ручной поиск: не рекомендуется

Этот подход подходит только для взаимодействия с устаревшим кодом в особых ситуациях. Почти всегда предпочтительнее создавать одноэлементный класс адаптеров, который Spring может использовать для autowire, и устаревший код может вызывать, но можно напрямую спросить контекст приложения Spring для bean-компонента.

Для этого вам нужно класс, к которому Spring может ссылаться на объект ApplicationContext:

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;   
    }

    public static ApplicationContext getContext() {
        return context;
    }
}

Затем ваш устаревший код может вызывать getContext() и извлекать необходимые ему компоненты:

@Controller
public class MileageFeeController {    
    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        MileageFeeCalculator calc = ApplicationContextHolder.getContext().getBean(MileageFeeCalculator.class);
        return calc.mileageCharge(miles);
    }
}

Тег, который работает путем ручного поиска объекта службы в контексте Spring: working-manual-lookup

8
задан Andrew Thompson 15 May 2011 в 10:45
поделиться

7 ответов

Есть ли способ выровнять JLabels по вертикали справа, так что начальные последовательности JTextFields, которые будут следовать, будут выровнены?

1.6+, GroupLayout . НАПРИМЕР. из JavaDocs:

enter image description here [/g2]

Используйте выравнивание меток, которое подталкивает текст к RHS.


См. также этот ответ для MCVE.

[/g3]

6
ответ дан Community 22 August 2018 в 09:38
поделиться

Вы не указали, какой макет вы используете, поэтому хороший макет для реализации будет GridBagLayout . Демонстрация на сайте oracle отлично подходит для начала.

И короткий пример:

JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
panel.add(new JLabel("Label 1:"), c);
c.gridx = 1;
c.gridy = 0;
panel.add(new JTextField("TextField 1"), c);
c.gridx = 0;
c.gridy = 1;
panel.add(new JLabel("Label 2:"), c);
c.gridx = 1;
c.gridy = 1;
panel.add(new JTextField("TextField 2"), c);
6
ответ дан Andrew Thompson 22 August 2018 в 09:38
поделиться
  • 1
    +1, но вскоре они будут жаловаться на компоновку компонентов в середине при изменении размера графического интерфейса. Не забывайте вес и вес. :) – Hovercraft Full Of Eels 15 May 2011 в 00:13
  • 2
    Этот подход хорошо выглядит как один LabelTextPanel (имеющий GridBagLayout) для каждой строки в GridLayout. – trashgod 15 May 2011 в 00:52

Хорошие решения для этого, которые я видел, включают использование GridBagLayout (как отмечено выше) или MiGLayout , хотя, поскольку последний не является частью стандартного Java, он должен быть загружен и помещается на путь класса перед использованием. MiGLayout не так сложно использовать.

1
ответ дан Hovercraft Full Of Eels 22 August 2018 в 09:38
поделиться

Это идеальный вариант использования для DesignGridLayout :

DesignGridLayout layout = new DesignGridLayout(contentPane);
layout.labelAlignment(LabelAlignment.RIGHT);
layout.row().grid(label1).add(field1);
layout.row().grid(label2).add(field2);
...
2
ответ дан jfpoilpret 22 August 2018 в 09:38
поделиться
  • 1
    Включает приятную демонстрацию JWS. – trashgod 15 May 2011 в 11:35
  • 2
    Это не часть стандартной библиотеки – Murmel 12 October 2016 в 13:03
  • 3
    @ user1885518 OP не упомянул, что он должен быть частью стандартной библиотеки. – jfpoilpret 29 October 2016 в 08:18

или

можно выровнять только текст внутри JTextComponents с помощью

JLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
3
ответ дан mKorbel 22 August 2018 в 09:38
поделиться
  • 1
    +1 См. Также этот пример . – trashgod 15 May 2011 в 00:10
  • 2
    hmmm, что было хорошо и так же, как создать EmptyBorder на 10 пикселей, используя BorderLayout ... (поместите JComponents вокруг местоположений CENTER без каких-либо размеров) – mKorbel 15 May 2011 в 00:25

Я бы предложил менеджер компоновки GridLayout . Он представляет собой самое простое решение для показа наглядной визуализации элементов управления метками и текстовыми полями. Таким образом, вы просто определяете количество строк и столбцов во время создания экземпляра, а добавленные элементы управления будут обрабатываться менеджером.

1
ответ дан Osiris76 22 August 2018 в 09:38
поделиться
  • 1
    Но метки и текстовые поля вынуждены быть одного размера, что обычно приводит к очень уродливому графическому интерфейсу. Я не советую использовать это. – Hovercraft Full Of Eels 15 May 2011 в 00:11
  • 2
    @Hovercraft верна, хотя это может работать, если метки и поля имеют сопоставимый размер и при использовании с ответом @ mKorbel . – trashgod 15 May 2011 в 00:14

LayoutManager родительского компонента имеет ответственность за размещение содержащихся элементов. Возможно, вам нужно установить XYLayout.

См. SetLayoutManager () для вашего родительского класса.

0
ответ дан SJuan76 22 August 2018 в 09:38
поделиться
  • 1
    -1, XYLayout не является стандартным макетом, а менеджеры макетов, основанные на абсолютном позиционировании, не следует поощрять, поскольку они не являются менеджерами макетов. – camickr 15 May 2011 в 01:35
Другие вопросы по тегам:

Похожие вопросы: