覆盖JTextField中的paint方法以绘制文本

时间:2012-04-23 13:37:35

标签: 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(number),0,0);
     }  
}  

任何想法,这甚至可能吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

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

正如@mKorbel所指出的,没有必要覆盖JTextField以获取红色数字,只需使用公共方法进行配置即可。 OTOH ..

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

如果这完全是关于数字的,那么最好的方法可能是JSpinner使用SpinnerNumberModel,并设置自定义SpinnerUI

答案 2 :(得分:1)

也许没有理由覆盖JTextFieldpaintComponent(),而不是使用

  • JTextField.setBackground()

  • JTextField.setForeground()

  • JTextField.setFont()

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

  • 通过放置Html彩色或特殊格式的文字可以实现一些黑客攻击

编辑

也许这个问题是关于

  • KeyEvents
  • 中过滤Document / DocumentListener

  • JFormattedTextFieldNumber Formatter

答案 3 :(得分:1)

为什么不在JLabel的前面添加一个小JTextFieldJLabel可以包含该号码,因为它不可编辑,所以无论用户在JTextField中发生什么变化,它都会一直存在。您也可以通过调用JLabel来格式化setForeground(Color.RED);以使其变为红色。这可能是一个更简单的解决方案吗?

例如,而不是这样做......

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);

JLabel左侧添加了红色JTextField,并且由于您BorderLayout使用JPanel,它会自动生成JLabel 1}}它可能是最小的。