我知道这个问题已经很老了,但是我在寻找其他东西时偶然发现了它,并认为我会为遇到它的其他人加两分钱。
原因: OPs 报告问题的原因与他假设的完全一样......即在super.paintComponent(g)
他的自定义绘画代码上有效绘画的行为。
但是......他发布的代码并没有什么问题。它确实/将起作用,我必须分别不同意 DanD 建议的答案。不幸的是,OP 没有包含更多示例代码,因此只能推测他的确切问题。
嗯?你问。那么怎么回事呢?
修复:很简单,如果您想使用这种方法自定义 JTextField 的外观,那么您必须有效地告诉超类不要在您的自定义绘画上进行绘画。这是通过在组件上设置以下属性值来完成的:
text.setOpaque(false);
text.setBorder(null);
通过这种方式,您可以让所有代码保持原样,并且您实际上是在告诉原始的 paintComponent() 方法不要绘制背景颜色或绘制边框。
我提供以下 SSCCE 作为示例和解决方案。请注意以下事项:
我创建了一个静态布尔值“FIXIT”。希望不用说您不会将其包含在“生产”代码中;它在示例中被使用以允许您观察这两种行为。只需切换其值即可查看“之前”和“之后”。
更重要的是(IMO),请注意我在自定义代码类的外部设置了提到的属性值。我这样做是为了更符合 OP 提出问题的方式,并且这种方法不需要更改他的自定义类。但是,正如代码中的注释所述,更强大的解决方案将在自定义类构造函数中设置这些值以确保它们的正确性。
我还提供了一种更具视觉吸引力的绘画方法。虽然它几乎与原版相同,但请参阅所做调整的评论。当然,这只是我的观点,但仍作为示例提供。
package misc;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
/**
* An SSCCE in response to the following StackOverflow question:
* https://stackoverflow.com/questions/13109638/my-custom-jtextfield-covered-by-super-paintcomponentg-method
*
* @author kansasSamurai
*
*/
@SuppressWarnings("serial")
public class CustomTextField extends JTextField {
private static boolean FIXIT = true;
public static void main(String args[]) {
SwingUtilities.invokeLater( new Runnable() {
@Override public void run() { createAndShowGUI(); }
} );
}
protected static void createAndShowGUI() {
JFrame frame = new JFrame("SSCCE - CustomTextField");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridBagLayout());
CustomTextField text = new CustomTextField();
text.setText(" Ipsum Lorem ");
if (FIXIT) {
// These two lines are NECESSARY...
text.setOpaque(false);
text.setBorder(null);
// or!!! ... they could/should be added to the constructor(s) of your custom class
// These two lines are OPTIONAL
text.setForeground(Color.white);
text.setCaretColor(Color.white);
}
frame.getContentPane().add(text);
frame.pack();
frame.setSize(330, 100); // these dimensions are "arbitrary"
frame.setLocationRelativeTo(null); // centers the frame on screen
frame.setVisible(true);
}
@Override
protected void paintComponent(Graphics g) {
if (FIXIT) {
this.betterPaint(g);
return;
}
final Graphics2D gd = (Graphics2D) g.create();
gd.setPaint(new GradientPaint(0, 0, Color.BLUE, getWidth(), 0, Color.BLACK));
gd.fillRoundRect(0, 0, getWidth(), getHeight(), getWidth() / 2, getHeight() / 2);
gd.dispose();
super.paintComponent(g);
}
protected void betterPaint(Graphics g) {
final Graphics2D gd = (Graphics2D) g.create();
// Improve appearance by enabling antialiasing
gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gd.setPaint(new GradientPaint(0, 0, Color.BLUE, getWidth(), 0, Color.BLACK));
// Fully rounded ends (not strictly required to fixit... just an example)
gd.fillRoundRect(0, 0, getWidth(), getHeight(), getHeight(), getHeight());
gd.dispose();
super.paintComponent(g);
}
}