<br>? \n? разрыв строки в Java

Самый легкий путь состоит в том, чтобы установить фокус где-нибудь. Можно сразу задержать фокус, но установка фокуса где угодно инициирует LostFocus-событие на любом типе управления и заставит его обновить свой материал:

IInputElement x = System.Windows.Input.Keyboard.FocusedElement;
DummyField.Focus();
x.Focus();

Иначе должен был бы получить сфокусированный элемент, получить обязательный элемент от сфокусированного элемента и инициировать обновление вручную. Пример для TextBox и ComboBox (необходимо было бы добавить любое управление, вводит Вас, должен поддерживать):

TextBox t = Keyboard.FocusedElement as TextBox;
if ((t != null) && (t.GetBindingExpression(TextBox.TextProperty) != null))
  t.GetBindingExpression(TextBox.TextProperty).UpdateSource();
ComboBox c = Keyboard.FocusedElement as ComboBox;
if ((c != null) && (c.GetBindingExpression(ComboBox.TextProperty) != null))
  c.GetBindingExpression(ComboBox.TextProperty).UpdateSource();
5
задан Jonik 4 August 2009 в 11:11
поделиться

4 ответа

Если это Swing для размещения полей в контейнере следует использовать диспетчер макета .

7
ответ дан 13 December 2019 в 05:39
поделиться

Разрыв строки не поможет при размещении объектов Swing; вам нужно разместить макет на центральной панели JPanel. То есть в центре вашего макета границы должен быть один объект Swing, JPanel, и вы должны установить его в стиле, который позволяет вам складывать каждый виджет. GridLayout (6,1) может это сделать.

2
ответ дан 13 December 2019 в 05:39
поделиться

Вы можете использовать менеджеры компоновки, такие как GridLayout или GridBagLayout . Хотя последний рекомендуется только для кода, сгенерированного генераторами графического интерфейса, я предпочитаю его, потому что он дает мне наибольшую гибкость.

JPanel panel = new JPanel();
GridBagLayout layout = new GridBagLayout();
panel.setLayout(layout);
layout.add(label1, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
layout.add(area1, new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
layout.add(label2, new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
layout.add(area2, new GridBagConstraints(1, 1, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
layout.add(label3, new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
layout.add(area3, new GridBagConstraints(1, 2, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
panel.add(label1);
panel.add(label2);
panel.add(label3);
panel.add(area1);
panel.add(area2);
panel.add(area3);

Конечно, это выглядит некрасиво, но должно помочь вам начать.

Вы также можете злоупотребить BorderLayout :

JPanel panel = new JPanel(new BorderLayout());
JPanel topRow = new JPanel();
panel.add(topRow, BorderLayout.PAGE_START);
topRow.add(label1);
topRow.add(area1);
JPanel middleRowBox = new JPanel(new BorderLayout());
panel.add(middleRowBox, BorderLayout.CENTER);
JPanel middleRow = new JPanel();
middleRowBox.add(middleRow, BorderLayout.PAGE_START);
middleRow.add(label2);
middleRow.add(area2);
JPanel bottomRowBox = new JPanel();
middleRowBox.add(bottomRowBox, BorderLayout.CENTER);
JPanel bottomRow = new JPanel();
bottomRowBox.add(bottomRow, BorderLayout.PAGE_START);
bottomRow.add(label3);
bottomRow.add(area3);
bottomRowBix.add(new JPanel(), BorderLayout.CENTER);
2
ответ дан 13 December 2019 в 05:39
поделиться

Попробуйте использовать GridLayout для начала:

panel.setLayout(new GridLayout(0,2));
// the order of added components is important
panel.add(labelA);
panel.add(textAreaA);
panel.add(labelB);
panel.add(textAreaB);
...

Выглядит не очень красиво, но помогает начать.

Если вы не установите LayoutManager для новой панели, он будет использовать FlowLayout, который ведет себя как макет HTML. Но в FlowLayout нет такой вещи, как предполагаемый разрыв строки. Он просто будет помещать компонент за компонентом, пока не достигнет конца доступного пространства, а затем начнет новую строку.
Если вам нужен контроль над макетами - не используйте FlowLayout.

Менеджеры макетов, о которых вы, возможно, захотите познакомиться, это:

  • BorderLayout - очень хорошо, если вам нужен контент с изменяемым размером
  • GridLayout - просто равняется ширине и высоте grid
  • null - позволяет использовать setBounds для каждого компонента, чтобы получить абсолютные позиции.

Есть и другие, но эти три должны позволить вам разметить 95% ваших панелей.

1
ответ дан 13 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

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