Java 重写JTextField中的绘制方法以绘制文本

Java 重写JTextField中的绘制方法以绘制文本,java,swing,graphics,jtextfield,Java,Swing,Graphics,Jtextfield,我希望通过覆盖paint方法在JTextField上绘制一个数字。这样,当用户编辑文本字段时,数字不会消失。然而,目前,这个数字根本没有出现,我尝试过: public void paintComponent(Graphics g) { super.paintComponent(g); if(number != 0){ g.setColor(Color.RED); g.drawString(String.valueOf(num

我希望通过覆盖paint方法在
JTextField
上绘制一个数字。这样,当用户编辑文本字段时,数字不会消失。然而,目前,这个数字根本没有出现,我尝试过:

public void paintComponent(Graphics g) {  
     super.paintComponent(g);
     if(number != 0){
            g.setColor(Color.RED);
            g.drawString(String.valueOf(number),0,0);
     }  
}  

任何想法,这可能吗?

也许没有理由重写
paintComponent()
,而不是使用

  • JTextField.setBackground()

  • JTextField.set前台()

  • JTextField.setFont()

  • JTextField.setHorizontalAlignment(javax.swing.SwingConstants.LEFT)

  • 有些黑客可能会将
    Html
    彩色或特殊格式的文本放在那里

编辑

也许这个问题是关于

  • Document/DocumentListener

  • JFormattedTextField
    带有
    数字格式化程序

可能没有理由覆盖而不是使用
paintComponent()

  • JTextField.setBackground()

  • JTextField.set前台()

  • JTextField.setFont()

  • JTextField.setHorizontalAlignment(javax.swing.SwingConstants.LEFT)

  • 有些黑客可能会将
    Html
    彩色或特殊格式的文本放在那里

编辑

也许这个问题是关于

  • Document/DocumentListener

  • JFormattedTextField
    带有
    数字格式化程序

    • 为什么不在
      JTextField
      的前面添加一个小的
      JLabel
      JLabel
      可能包含数字,因为它不可编辑,所以无论用户在
      JTextField
      中做了什么更改,它都将始终存在。您还可以通过调用
      setForeground(Color.red)来格式化
      JLabel
      ,使其变为红色。这可能是一个更简单的解决方案

      例如,与其这样做

      JPanel panel = new JPanel(new BorderLayout());
      JTextField textfield = new JTextField("Hello");
      panel.add(textfield,BorderLayout.CENTER);
      
      你可以这样做

      JPanel panel = new JPanel(new BorderLayout());
      
      JTextField textfield = new JTextField("Hello");
      panel.add(textfield,BorderLayout.CENTER);
      
      JLabel label = new JLabel("1.");
      label.setForeground(Color.RED);
      panel.add(label,BorderLayout.WEST);
      

      这会在
      JTextField
      的左侧添加一个红色的
      JLabel
      ,由于您正在为
      JPanel
      使用
      BorderLayout
      ,因此它会自动使
      JLabel
      尽可能最小。

      为什么不在
      JTextField
      前面添加一个小的
      JLabel
      JLabel
      可能包含数字,因为它不可编辑,所以无论用户在
      JTextField
      中做了什么更改,它都将始终存在。您还可以通过调用
      setForeground(Color.red)来格式化
      JLabel
      ,使其变为红色。这可能是一个更简单的解决方案

      例如,与其这样做

      JPanel panel = new JPanel(new BorderLayout());
      JTextField textfield = new JTextField("Hello");
      panel.add(textfield,BorderLayout.CENTER);
      
      你可以这样做

      JPanel panel = new JPanel(new BorderLayout());
      
      JTextField textfield = new JTextField("Hello");
      panel.add(textfield,BorderLayout.CENTER);
      
      JLabel label = new JLabel("1.");
      label.setForeground(Color.RED);
      panel.add(label,BorderLayout.WEST);
      

      它在
      JTextField
      的左侧添加了一个红色的
      JLabel
      ,并且因为您正在为
      JPanel
      使用
      BorderLayout
      ,因此它会自动使
      JLabel
      尽可能最小。

      尝试在
      g.drawString(String.valueOf(number),0,0)呼叫。例如,使用
      getHeight()/2
      尝试在
      g.drawString(String.valueOf(number),0,0)中使用Y位置呼叫。例如,使用
      getHeight()/2

      …当用户编辑文本字段时,数字不会消失

      正如@mKorbel所指出的,为了获得红色数字,不需要重写
      JTextField
      ,只需使用公共方法对其进行配置即可。奥托

      g.drawString(String.valueOf(number),0,0);
      
      如果这真的是关于数字的,也许最好的方法是将a与a一起使用,并设置一个自定义

      …当用户编辑文本字段时,数字不会消失

      正如@mKorbel所指出的,为了获得红色数字,不需要重写
      JTextField
      ,只需使用公共方法对其进行配置即可。奥托

      g.drawString(String.valueOf(number),0,0);
      

      如果这真的是关于数字的,也许最好的方法是将a与a一起使用,并设置一个自定义值。

      在我看到“将Html格式的文本放在那里”之前,我就准备投票,在像
      JTextField
      ;这样的纯文本组件中,这看起来不是很好。)是否有机会编辑、澄清?@Andrew Thompson完成了,但没有明确说明您的评论,如果您希望从-->到插入符号、输入掩码、文档等高亮显示positions,则可能会有一个答案。我只是指支持(HTML)格式文本的组件,如
      JEditorPane
      。。我实际上认为用例需要一个配置好的文本字段+1,(现在)前4分。@Andrew Thompson最初我想回答,但我需要检查一下以前是否睡过觉,呵呵,以相反的形式:-)FanClub(不屑一顾的)Peh。看看脚本是否会自动检测并删除这19张否决票将是一件有趣的事情在我看到“将Html格式的文本放在那里”之前,我正准备投票表决,这在像
      JTextField
      ;这样的纯文本组件中看起来不是很好是否有机会编辑、澄清?@Andrew Thompson完成了,但没有明确说明您的评论,如果您希望从-->到插入符号、输入掩码、文档等高亮显示positions,则可能会有一个答案。我只是指支持(HTML)格式文本的组件,如
      JEditorPane
      。。我实际上认为用例需要一个配置好的文本字段+1,(现在)前4分。@Andrew Thompson最初我想回答,但我需要检查一下以前是否睡过觉,呵呵,以相反的形式:-)FanClub(不屑一顾的)Peh。看看脚本是否会自动检测并删除这19张否决票将是一件有趣的事情对不起,澄清一下,我的意思是说,而不是艾丁