Java Swing-如何混合JTextField和JTextAreas并具有相同的视觉外观?
我正在使用miglayout创建一个表单,其中有JTextFields(短输入答案)和JTextAreas(长答案)。这个问题有两个方面Java Swing-如何混合JTextField和JTextAreas并具有相同的视觉外观?,java,user-interface,swing,miglayout,Java,User Interface,Swing,Miglayout,我正在使用miglayout创建一个表单,其中有JTextFields(短输入答案)和JTextAreas(长答案)。这个问题有两个方面 滚动窗格包装文本区域周围的边框与文本字段的边框不匹配 textarea/textfield的宽度和位置不同,导致它们不能正确对齐 从右/左更改为右/填充后: 您可以看到边界对齐,但仍然存在间隙。我尝试设置novisualpadding,但这并没有解决它 源代码: package test2; import javax.swing.JFrame; impor
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的首选方法是什么?现在我注意到,当焦点位于文本区域时,文本区域周围有一个蓝色高亮显示,而不是文本区域。。。视觉不连续的另一个来源。不确定如何解决边界问题,但要解决布局问题,我只使用springlayout。Springlayout只是在JPanel中更好地布局元素的一种方法。你可以了解更多 具体来说,您可以通过设置每个元素的北、南、西和东边界来使用它。要做到这一点,您必须首先将标签调用从add中取出,这样每个调用都可以被命名。因此,不是:
add(new JLabel("Text field:"));
做:
对于每个元素(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像素。对于布局问题,请尝试使用
[right][fill]
的columnConstraints
值,而不是[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);
我知道MiGLAyout(顺便说一句,我很喜欢)能够对视觉对齐和严格的像素对齐进行特殊处理。你可能会遇到这个。。。“al”单元标识符用于此,但我没有使用它,因此无法提供示例。可能值得下载MiG示例项目,看看它们是否有相同的对齐问题(我确信它们的面板与您的类似)
值得一提的是,我们经常在同一个面板中混合文本字段和区域,不会遇到这种情况。。。我们必须按照Noel Ang的建议,将滚动窗格的边框设置为与文本字段的边框相同
此外,我们通常在添加每个组件时指定约束,而不是在布局构造函数中指定约束-不确定这是否会产生差异…对于屏幕截图,使用First off+1。
既然你在使用Mac,你有没有试过Quaqua的外观和感觉?它正确地呈现文本框/区域。答案是MiG布局人员是 你好, 苹果有一个讨厌的习惯,默认情况下会进行补偿,而不是让开发者来决定。在这种情况下,他们添加了一个边框,使其更像OSX。这应该是布局管理器的选择 MigLayout可以补偿像这样的视觉边界,但它只在WindowsXP中对JTabbedPane进行补偿。不过,我不确定它在OSX中是否能100%好用。我得检查一下。我们不希望文本字段只是增长到边界 我已将其添加到下一版本的待办事项列表中
我知道这个问题已经很老了,但是要使
TextArea
的边框与TextField
的边框匹配:
(myTextArea).setBorder(new JTextField().getBorder());
这应该给你的
TextArea
一个边框,就像TextField
的[fill]帮助一样。然而,在MacOSX上,大小仍然不是完美的:也许更适合的替代方法是采用一种组件类型的首选边界,并将其应用于另一种组件类型;例如,TeXField.StEdError(ScRelpNe.GETBulter())。考虑给予java. AWT.GrIDBayFayStudio一个尝试。更多代码请参见我的修订答案。很好!但它应该是“newjtextfield().getBorder()”
(myTextArea).setBorder(new JTextField().getBorder());