gpt4 book ai didi

java - 自定义 JTextField

转载 作者:搜寻专家 更新时间:2023-11-01 02:32:24 26 4
gpt4 key购买 nike

我想知道如何自定义 jtextfield 的用户界面,这样我就可以创建圆角矩形边框,而文档不会超出边框。

到目前为止,我想我已经尝试了我能想到的大部分方法,我创建了一个新的 FieldView 类,并根据我绘制圆角矩形的自定义边框更改了 paint 方法中的形状,这是我唯一的方法设法摆脱白色文本字段文档/ View 是将其设置为不透明,但我认为应该有另一种不设置不透明值的方法。

您在自定义 jtextfield 的 laf 方面有任何经验吗,请回信,我什至读过 Core Swing 高级书籍,但没有运气,如果您尝试使用 google 进行搜索,请告诉我搜索短语,因为我已经尝试使用关键字,例如“样式”、“定制”、“ui”、“plaf”、“laf”等等。

我真诚地希望你能给我一个正确方向的插入,我希望没有人会因此而挑起争端,我真的已经用尽了我能想到的所有资源。

诚挚的问候。

最佳答案

我昨天想解决几乎相同的问题,我从你的想法中得到了一些启发,我终于找到了解决方案。

  1. 要在 JTextField 的边框内制作文档,您可以使用

javax.swing.border.EmptyBorder.EmptyBorder(Insets borderInsets)

2.为了避免JTextField的四个角出现空白,可以使用

g2d.setStroke(new BasicStroke(12));

在绘制圆角矩形之前。描边的宽度根据你的需要,只要足够宽以覆盖角落的空间即可。

这是代码:

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.AbstractBorder;
import javax.swing.border.EmptyBorder;


public class JTextFieldTest {
JTextField textField;
boolean activate = false;

public void createUI(){
JFrame frame = new JFrame("Test JTextField");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(true);

MainPanel mainPanel = new MainPanel();
mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
frame.add(mainPanel,BorderLayout.CENTER);

frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
JTextFieldTest jTextFieldTest = new JTextFieldTest();
jTextFieldTest.createUI();
}

public void setActivate(boolean activate){
this.activate = activate;
}

@SuppressWarnings("serial")
class MainPanel extends JPanel{
public MainPanel(){

textField = new JTextField("Please input:");
Font fieldFont = new Font("Arial", Font.PLAIN, 20);
textField.setFont(fieldFont);
textField.setBackground(Color.white);
textField.setForeground(Color.gray.brighter());
textField.setColumns(30);
textField.setBorder(BorderFactory.createCompoundBorder(
new CustomeBorder(),
new EmptyBorder(new Insets(15, 25, 15, 25))));
textField.addActionListener(new FieldListener());
textField.addMouseListener(new FieldMouseListener());


add(textField,BorderLayout.CENTER);
setBackground(Color.blue);
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
}
}

@SuppressWarnings("serial")
class CustomeBorder extends AbstractBorder{
@Override
public void paintBorder(Component c, Graphics g, int x, int y,
int width, int height) {
// TODO Auto-generated method stubs
super.paintBorder(c, g, x, y, width, height);
Graphics2D g2d = (Graphics2D)g;
g2d.setStroke(new BasicStroke(12));
g2d.setColor(Color.blue);
g2d.drawRoundRect(x, y, width - 1, height - 1, 25, 25);
}
}

class FieldListener implements ActionListener{

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(textField.getText());
}

}

class FieldMouseListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(activate == false){
textField.setText("");
}
activate = true;
textField.setForeground(Color.black);
}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}
}
}

是效果:

enter image description here

更多详情,您可以浏览How to make a round rectangle JTextField

关于java - 自定义 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6008058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com