Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-如何混合JTextField和JTextAreas并具有相同的视觉外观?_Java_User Interface_Swing_Miglayout - Fatal编程技术网

Java Swing-如何混合JTextField和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

我正在使用miglayout创建一个表单,其中有JTextFields(短输入答案)和JTextAreas(长答案)。这个问题有两个方面

  • 滚动窗格包装文本区域周围的边框与文本字段的边框不匹配
  • textarea/textfield的宽度和位置不同,导致它们不能正确对齐
  • 从右/左更改为右/填充后: 您可以看到边界对齐,但仍然存在间隙。我尝试设置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的首选方法是什么?现在我注意到,当焦点位于文本区域时,文本区域周围有一个蓝色高亮显示,而不是文本区域。。。视觉不连续的另一个来源。

    不确定如何解决边界问题,但要解决布局问题,我只使用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());