【问题标题】:Change JTextField scrollpane text padding/offset by some pixels将 JTextField 滚动窗格文本填充/偏移更改一些像素
【发布时间】:2023-03-20 23:30:01
【问题描述】:

我正在尝试对齐 JTextField 中文本的位置(开始 + 结束),但我无法找到和/或理解如何执行此操作...

example of what is wrong and what i'm looking for:

setHorizo​​ntalAlignment 方法只允许这个..:

•JTextField.LEFT 
•JTextField.CENTER 
•JTextField.RIGHT 
•JTextField.LEADING 
•JTextField.TRAILING

对于android项目,这很容易......但是为了我,我无法弄清楚这个,当做一个swing项目时......这怎么做?

编辑:

我已经能够通过使用双(又名分层)JTextFields 对这个进行排序。 emptyborder(),虽然代码更简单,但会删除所有 JTextField 框架边框,留下一个大的空方块,对于输入框,这不是一个好主意...这是一张图片和一些代码示例:

JTextField Padding Working example

import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

public class TextBoxOffset {

    public static void main(String[] a) {

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setSize(300, 300);
        frame.setVisible(true);

        JLabel label1 = new JLabel("JTextField, using CreateEmptyBorder");
        label1.setHorizontalAlignment(SwingConstants.CENTER);
        label1.setFont(new Font("Tahoma", Font.PLAIN, 11));
        label1.setBounds(0, 125, 284, 23);
        frame.getContentPane().add(label1);

        //Creates a new JTextField with a emptyborder
        JTextField emptyborder = new JTextField();
        emptyborder.setBounds(22, 164, 250, 43);
        emptyborder.setBorder(new EmptyBorder(5, 17, 5, 15));
        frame.getContentPane().add(emptyborder);

        JLabel label2 = new JLabel("JTextField, using double (layered) JTextFields");
        label2.setFont(new Font("Tahoma", Font.PLAIN, 11));
        label2.setHorizontalAlignment(SwingConstants.CENTER);
        label2.setBounds(0, 22, 284, 23);
        frame.getContentPane().add(label2);

        // Creates a new input field, layered above the (disabled) JTextField background object
        JTextField inputbox = new JTextField();
        inputbox.setBounds(40, 61, 216, 31);
        inputbox.setBorder(null);
        frame.getContentPane().add(inputbox);

        // Creates a border for the input text field that will serve as a background
        JTextField bg = new JTextField();
        bg.setBounds(22, 56, 250, 43);
        frame.getContentPane().add(bg);
        bg.setEnabled(false);

        // Grab the overlayed inputbox focus
        inputbox.requestFocusInWindow();
    }
}

如果有人知道更好、更简单的方法,即控制 JTextField(或任何其他重要字段(例如:控制按钮内文本的位置)不使用双 JTextFields,请发表回复。

【问题讨论】:

标签: java swing


【解决方案1】:

我认为您想在文本字段中添加边框:

textField.add( new EmptyBorder(...) );

阅读 How to Use Borders 上的 Swing 教程部分,了解更多信息和示例。

在做一个摇摆项目时,我无法弄清楚这一点。

保留 Swing 教程的链接,方便了解 Swing 基础知识。

编辑:

糟糕,我忘记了 JTextField 也有一个特殊的方法来控制它:

textField.setInsets(...);

因此您不需要 CompoundBorder,但是您仍然了解 CompoundBorder 提供的灵活性。

【讨论】:

  • 是的,EmptyBorder() 确实允许您对 JTextField 内的顶部、左侧、底部、右侧填充进行一些控制......但有一个主要缺点:您会松开所有 JTextField 边框,强制您要: a) 添加背景图像,“欺骗”具有 JTextField 边框的效果(注意:如果您需要动态调整窗口大小,使用静态图像可能会导致问题!); b) 有一个分层的 JTextField,有它自己的边框(实际上使 EmptyBorder() 放在一起的目的无效)。我已经编辑了我的问题并添加了一个使用后者的工作示例。
  • @JoaoAlonso,那么您可以使用CompoundBorderCompoundBorder 可以包含原始边框和空边框。阅读教程,它有一个CompoundBorder 的示例。
  • 谢谢你,camickr!使用 CompoundBorder 就可以了!将 setMargins 与 setInsets 一起使用,确实有效,但在重绘文本字段时确实有一些限制(在我的主项目中,我在获取 textinput 焦点时更改了颜色边框,据记载它有一些限制:docs.oracle.com/javase/7/docs/api/javax/swing/text/…)。
【解决方案2】:

我认为最简单的方法是使用:

textField.setMargin(new Insets(...));

我一直在寻找同样的结果,这确实让我很开心,我希望它也能帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2015-09-29
    • 2023-03-09
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多