【问题标题】:Is there a way for JTextField to render the UI value different from the value getting from getText method? [closed]JTextField 有没有办法呈现不同于从 getText 方法获得的值的 UI 值? [关闭]
【发布时间】:2021-03-05 19:27:14
【问题描述】:

我正在尝试创建一个自定义文本字段,当登录用户无权访问数据时,自定义文本字段需要屏蔽该值,但 getText 方法中文本字段内的实际值无法更改因为该值需要执行一些验证。对于 JTable 是通过使用自定义渲染器完成的,但 Textfield 似乎没有任何渲染器。

示例:交易表单,有一个余额字段显示账户余额,但实际余额不应该显示给所有者以外的其他人使用,因此UI会显示0但当用户进行交易时实际余额在文本字段中应该仍然能够获取用于验证目的。

我试图避免使用临时变量来存储实际值。并且客户不接受未经授权的隐藏字段。

我也尝试不将代码更改为面板级别或表单级别,以尽量减少对所有现有表单实施此增强的工作。

【问题讨论】:

  • 如果当前用户不是所有者,只需隐藏框架上的文本字段。
  • @camickr 设计从框架中隐藏文本字段是我们的客户不接受的。对于 JPasswordfield,我还在寻找任何编码解释以帮助实现这一目标。将尝试扩展 JPasswordField 并尝试。谢谢推荐。

标签: java swing jtextfield renderer


【解决方案1】:

创建两个JTextField,其中一个具有实际金额,另一个具有零金额。将两个JTextField 添加到带有CardLayoutJPanel 以仅显示JTextField 之一。下面是一个演示。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.ComponentOrientation;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class SwapFlds implements ActionListener {
    private JFrame  frame;
    private JPanel  swapper;

    @Override // java.awt.event.ActionListener
    public void actionPerformed(ActionEvent event) {
        CardLayout cl = (CardLayout) swapper.getLayout();
        cl.next(swapper);
    }

    private JPanel createButton() {
        JButton button = new JButton("Swap");
        button.addActionListener(this);
        JPanel panel = new JPanel();
        panel.add(button);
        return panel;
    }

    private JPanel createSwapper() {
        swapper = new JPanel(new CardLayout());
        JPanel real = new JPanel();
        JTextField realAmount = new JTextField(10);
        realAmount.setText("Real amount");
        real.add(realAmount);
        swapper.add(real, "real");
        JPanel dummy = new JPanel();
        JTextField dummyAmount = new JTextField(10);
        dummyAmount.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        dummyAmount.setText("0");
        dummy.add(dummyAmount);
        swapper.add(dummy, "dummy");
        return swapper;
    }

    private void showGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createSwapper(), BorderLayout.PAGE_START);
        frame.add(createButton(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new SwapFlds().showGui());
    }
}

【讨论】:

  • 感谢您提供建议的答案,但这是一种在组件级别自定义它而不将其带到面板级别的方法吗?因为这需要在许多现有表单中实现,我们尽量减少此增强所需的工作量。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 2019-07-12
  • 2021-07-24
  • 1970-01-01
  • 2016-12-04
  • 2022-01-19
相关资源
最近更新 更多