Swing - как смешивать JTextField и JTextAreas и иметь одинаковый внешний вид?

Я использую miglayout для создания формы, в которой есть JTextFields (короткие входные ответы), а также JTextAreas (более длинные ответы). Проблема двоякая.

  1. граница, расположенная вокруг области текста, обернутой полосой прокрутки,не соответствует текстовому полю.
  2. ширина и размещение textarea / textfield отличаются, в результате чего они не выстраиваются правильно.

alt текст http://grab.by/3O0V

после изменение справа / слева направо / заполнить: alt текст http://grab.by/3RMk Вы можете видеть, что границы выстраиваются в линию, но все еще есть пробелы. Я попытался установить novisualpadding, но это не исправить.

исходный код:

package test2;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;

public class Test extends JPanel {

private static final int NUM_CHARACTERS_WIDTH = 20;
private static final int NUM_ROWS = 5;
public Test() {

    setLayout(new MigLayout(
            "wrap 2",
            // Align text labels on the so their right edge meets left edge of the text fields
            "[right][left]"
            ));

    add(new JLabel("Text field:"));
    add(new JTextField(NUM_CHARACTERS_WIDTH));

    add(new JLabel("No scrollpane text area:"));
    add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH));

    add(new JLabel("Scrollpane text area:"));
    add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)));

    add(new JLabel("Text field:"));
    add(new JTextField(NUM_CHARACTERS_WIDTH));

}


public static void main(String[] args) {
    JFrame frame = new JFrame("");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new Test();
    frame.add(panel);
    frame.pack();
    frame.setVisible(true);
}

}

каков предпочтительный способ смешивания и сопоставления jtextfield и jtextareas, сохраняя при этом визуальную гармонию? Теперь я замечаю, что текстовое поле имеет синюю подсветку вокруг него, когда фокус находится в нем, в отличие от текстовая область... еще один источник нарушения зрения.

6 ответов


Я знаю, что этот вопрос довольно старый, но получить границу для TextArea в соответствии с TextField:

(myTextArea).setBorder(new TextField().getBorder());

Это должно дать границу вашему TextArea как вокруг TextField.


не уверен, как вы можете исправить свою проблему границы, но исправить ситуацию с макетом я бы просто использовал springlayout. Springlayout-это просто способ улучшить компоновку ваших элементов в JPanel. Вы можете узнать больше об этом Java Sun Учебник

в частности, вы используете его, установив, где вы хотите свои северные, южные, западные и восточные границы каждого элемента. Для этого вам нужно будет сначала вывести вызовы меток из добавления, чтобы каждый из них мог быть назван. Так что вместо этого из:

add(new JLabel("Text field:"));

Do:

JLabel myLabelName = new JLabel("Text field:");
add(myLabelName);

для каждого из ваших элементов (JLabels, JTextAreas и JTextField). Как только это будет сделано, вы можете легко установить макет.

Springlayout layout = new SpringLayout();
setLayout(layout);

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

layout.putConstraint(SpringLayout.NORTH, FirstTextAreaName, 10, SpringLayout.NORTH, this);
layout.putConstraint(SpringLayout.WEST, FirstTextAreaName, this.getWidth()/2, SpringLayout.WEST, this);
layout.putConstraint(SpringLayout.EAST, FirstTextAreaName, -10, SpringLayout.EAST, this);

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

layout.putConstraint(SpringLayout.NORTH, SecondTextAreaName, 10, SpringLayout.SOUTH, FirstTextAreaName);

вторая строка в приведенном выше примере восточной части области текста, чтобы начать на полпути ваша главная панель. Последняя, третья, строка устанавливает восточную сторону текстовой области на 10 пикселей от восточной стороны главной панели.


для проблемы макета, попробуйте columnConstraints стоимостью [right][fill] вместо [right][left].

для другой проблемы это, по-видимому, выглядит непоследовательностью. Я побежал ваш код в Windows, и различия тоже есть, но менее грубое. Мое предложение состояло бы в том, чтобы установить идентифицирующие границы явно для текстовых полей и текстовых областей.

setLayout(new MigLayout(
        "wrap 2",
        "[right][fill]"
        ));

JTextField textField;
JScrollPane scrollPane;

add(new JLabel("Text field:"));
textField = new JTextField(NUM_CHARACTERS_WIDTH);
textField.setBorder( new EtchedBorder( EtchedBorder.LOWERED ) );
add(textField);

add(new JLabel("No scrollpane text area:"));
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH));

add(new JLabel("Scrollpane text area:"));
scrollPane = new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH));
scrollPane.setBorder( new EtchedBorder( EtchedBorder.LOWERED ) );
add(scrollPane);

add(new JLabel("Text field:"));
textField = new JTextField(NUM_CHARACTERS_WIDTH);
textField.setBorder( new EtchedBorder( EtchedBorder.LOWERED ) );
add(textField);

Identicial границ http://img412.imageshack.us/img412/6341/clipboard01jl.png

если вы не удается получить MigLayout для выравнивания компонентов, учитывая использование java.ОУ.GridBagLayout:

import static java.awt.GridBagConstraints.*;

setLayout( new GridBagLayout() );

GridBagConstraints leftCons = new GridBagConstraints();
leftCons.anchor = NORTHEAST;
leftCons.fill = NONE;
leftCons.weightx = 1.0;
leftCons.gridy = RELATIVE;
leftCons.gridx = 0;
leftCons.insets = new Insets( 4, 8, 4, 8 );

GridBagConstraints rightCons = new GridBagConstraints();
rightCons.anchor = NORTHWEST;
rightCons.fill = HORIZONTAL;
rightCons.weightx = 1.0;
rightCons.gridy = RELATIVE;
rightCons.gridx = 1;
rightCons.insets = leftCons.insets;

add(new JLabel("Text field:"), leftCons);
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons);

add(new JLabel("No scrollpane text area:"), leftCons);
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH), rightCons);

add(new JLabel("Scrollpane text area:"), leftCons);
add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)), rightCons);

add(new JLabel("Text field:"), leftCons);
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons);

Я знаю, что MiGLAyout (который я люблю, кстати) имеет возможность делать специальную обработку для визуального выравнивания против строгого выравнивания пикселей. Вы можете столкнуться с этим... Для этого используется идентификатор единицы "al", но мне не пришлось его использовать, поэтому я не могу привести примеры. Вероятно, стоило бы загрузить образец проекта MiG и посмотреть, есть ли у них такая же проблема выравнивания (я уверен, что у них есть панели, похожие на ваши).

для чего это стоит, мы смешиваем текстовые поля и области в одна и та же панель довольно часто и не сталкивается с этим... Мы!--3-->do необходимо установить границу области прокрутки такой же, как граница текстового поля, как предложено Ноэль Анг.

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


во-первых +1 для снимков экрана. Поскольку вы используете Mac, вы пробовали Quaqua Look And Feel? Он правильно отображает текстовые поля/области.


ответ заключается в том, что люди макета MiG работа над исправлением для их следующей версии.

Здравствуйте,

Apple имеет неприятный habbit компенсации по умолчанию и не позволяет разработчику решать. Это такой случай, когда они добавили границу, чтобы сделать ее более визуально похожей на OS X. Это должен быть выбор менеджера макетов...

MigLayout может компенсировать визуальные границы, как это, но это делается только для JTabbedPane в Windows XP. Я не уверен, что это можно сделать на 100% хорошо в OS X, хотя. Я должен проверить. Мы не хотим, чтобы текстовое поле просто перерастало в границы.

Я добавил Это в список todo для следующей версии.