Swing - как смешать JTextField и JTextAreas и иметь одинаковый внешний вид? - PullRequest
8 голосов
/ 16 апреля 2010

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

  1. Граница, расположенная вокруг текстовой области, обернутой областью прокрутки, не совпадает с границей текстового поля.
  2. Ширина и расположение текстового поля / текстового поля различаются, что приводит к их неправильному выравниванию.

альтернативный текст http://grab.by/3O0V

После изменения справа /слева направо / заполнить: альтернативный текст 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 ]

7 голосов
/ 04 июня 2014

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

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

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

3 голосов
/ 16 апреля 2010

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

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

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 пикселях от восточной стороны главной панели.

2 голосов
/ 17 апреля 2010

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

Для чего бы то ни было, мы довольно часто смешиваем текстовые поля и области на одной панели и не сталкиваемся с этим ... Мы делаем должны установить границу панели прокрутки, чтобы она была такой же, как граница текстового поля, предложенная Ноэлем Энгом.

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

2 голосов
/ 16 апреля 2010

В случае проблемы макета попробуйте значение 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);

Идентичные границы http://img412.imageshack.us/img412/6341/clipboard01jl.png

Если вы не можете заставить MigLayout выровнять ваши компоненты, рассмотрите возможность использования java.awt.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);
0 голосов
/ 22 апреля 2010

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

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

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

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

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

0 голосов
/ 19 апреля 2010

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

...