8

我正在使用 miglayout 创建一个表单,其中有 JTextFields(简短的输入答案)以及 JTextAreas(较长的答案)。问题是双重的。

  1. 放置在 Scrollpane 环绕文本区域周围的边框与文本字段的边框不匹配。
  2. textarea/textfield 的宽度和位置不同,导致它们无法正确排列。

替代文字 http://grab.by/3O0V

从右/左更改为右/填充后: alt text 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 的首选方法是什么?我现在注意到,当焦点在其中时,文本字段周围有一个蓝色突出显示,而不是文本区域......另一个视觉不连续性的来源。

4

6 回答 6

8

我知道这个问题已经很老了,但是要让 a 的边界与 aTextArea相匹配TextField

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

这应该给你TextArea喜欢的一个边框围绕 a TextField

于 2014-06-03T20:50:57.103 回答
3

不知道如何解决边框问题,但要解决布局情况,我只会使用 springlayout。Springlayout 只是一种在 JPanel 中更好地布局元素的方法。你可以找到更多关于它的Java Sun 教程

具体来说,您可以通过设置每个元素的北、南、西和东边界来使用它。为此,您必须首先将标签调用从添加中取出,以便可以命名每个调用。所以而不是:

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

做:

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 个像素。

于 2010-04-16T17:44:30.307 回答
2

I know that MiGLAyout (which I love, BTW) has the ability to do special handling for visual alignment vs strict pixel alignment. You may be running into this... The 'al' unit identifier is used for this, but I haven't had to use it so can't provide examples. It would probably be worth downloading the MiG sample project and see if they have the same alignment issue (I'm sure they have panels similar to yours).

For what it's worth, we mix text fields and areas in the same panel quite frequently and don't run into this... We do have to set the border of the scroll pane to be the same as the border of the text field as suggested by Noel Ang.

此外,我们通常在添加每个组件时指定它们,而不是在布局构造函数中指定约束 - 不确定这是否会有所不同......

于 2010-04-17T05:26:06.797 回答
2

对于布局问题,请尝试使用 的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);

相同的边界

如果您无法让 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);
于 2010-04-16T18:37:06.180 回答
0

首先关闭 +1 用于屏幕截图。由于您使用的是 Mac,您是否尝试过 Quaqua Look And Feel?它正确呈现文本框/区域。

于 2010-04-19T19:58:06.773 回答
0

答案是 MiG Layout 人员正在为他们的下一个版本进行修复

你好,

苹果有一个讨厌的习惯,默认补偿,不让开发者决定。在这种情况下,他们添加了边框以使其在视觉上更像 OS X。这应该是布局管理器的选择...

MigLayout 可以补偿这样的视觉边界,但它仅适用于 Windows XP 中的 JTabbedPane。我不确定它可以在 OS X 中 100% 完成。我得检查一下。我们不希望文本字段只是增长到边界。

我已将此添加到下一个版本的待办事项列表中。

于 2010-04-22T13:27:07.503 回答