Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Linux上,JTextField super.paintComponent()忽略背景色_Java_Linux_Swing_Jtextfield_Paintcomponent - Fatal编程技术网

Java 在Linux上,JTextField super.paintComponent()忽略背景色

Java 在Linux上,JTextField super.paintComponent()忽略背景色,java,linux,swing,jtextfield,paintcomponent,Java,Linux,Swing,Jtextfield,Paintcomponent,好吧,我在这方面工作了一段时间,真是不知所措。在我的程序中,我通过创建扩展某些JComponents的新类,重写它们的paintComponent方法,并将这些类用于对象,来实现自定义UI外观。然而,这就是我迷路的地方。我有一个简单的窗口,它要求用户给它一个目录,然后检查目录,如果无法在该位置创建目录,则将文本字段(名为DraconicTextField,扩展为JTextField)的颜色更改为红色。我正在两台计算机上开发这个,使用git进行交叉。这在Windows上工作,但在Linux上失败。

好吧,我在这方面工作了一段时间,真是不知所措。在我的程序中,我通过创建扩展某些
JComponent
s的新类,重写它们的
paintComponent
方法,并将这些类用于对象,来实现自定义UI外观。然而,这就是我迷路的地方。我有一个简单的窗口,它要求用户给它一个目录,然后检查目录,如果无法在该位置创建目录,则将文本字段(名为
DraconicTextField
,扩展为
JTextField
)的颜色更改为红色。我正在两台计算机上开发这个,使用git进行交叉。这在Windows上工作,但在Linux上失败。代码如下:

类DraconicTextField扩展了JTextField{
私有静态最终长serialVersionUID=1L;
专用静态最终int-arcSize=13;
最终颜色文本颜色=新颜色(31,31,31);
最终颜色boxColor=新颜色(250250250);
最终颜色边框颜色=新颜色(250,250,250,0);
公共龙纹场(){
this.setOpaque(false);//true给出相同的结果,但如果按此设置,则角不会圆角
this.setForeground(textColor);//文本颜色
this.setBackground(boxColor);//BG color
this.putClientProperty(SwingUtilities2.AA\u TEXT\u PROPERTY\u KEY,null);
这个.setFont(新字体(“Arial”,Font.PLAIN,18));
this.setFont(GUIUtils.getDefaultFont(this.deriveFont(Font.PLAIN,18f));//GUIUtils已导入
此.setboorder(新的DraconCroundBorder(arcSize,borderColor));
}
@凌驾
公共虚空绘制组件(图形){
Graphics2D Graphics2D=(Graphics2D)图形;
graphics2d.setRenderingHint(RenderingHits.KEY\u抗锯齿,RenderingHits.VALUE\u抗锯齿打开);
graphics2d.setRenderingHint(RenderingHits.KEY\u TEXT\u ANTIALIAS,RenderingHits.VALUE\u TEXT\u ANTIALIAS\u ON);
graphics2d.setColor(this.getBackground());
graphics2d.fillRoundRect(0,0,this.getWidth(),this.getHeight(),arcSize,arcSize);
super.paintComponent(graphics2d);//我几乎可以肯定这就是问题的根源
}
}
为了节省一些空间,主框架类在找到要失效的目录时只需调用
gamedirBox.setBackground(/*some color*/)
。(我确信这是可行的!)

在我的测试中,我制作了一个简短(格式非常糟糕)的程序,看看我是否可以改变颜色,我可以,但这并没有覆盖
paintComponent
方法请注意,此代码不是上述代码的一部分下面是代码:

类GuiBox扩展了JFrame{
public JLabel thisIsTheLabel=this.label(“你好,世界!”);
public JTextField testBox=new JTextField();
publicjbuttontestbutton=newjbutton(“更改颜色!”);
private Random randy=新Random();
公共GuiBox(字符串标题){
超级(标题);
这个。设置大小(300400);
this.setLayout(新的FlowLayout());
测试盒。设置最小尺寸(新尺寸(200,40));
setPreferredSize(新尺寸(200,40));
setText(“这是一个非常长的字符串,因此流布局不再是****”;
试验箱.立根(新颜色(240240240));
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
testBox.setBackground(新颜色(randy.nextInt(255)、randy.nextInt(255)、randy.nextInt(255));
testBox.repaint();//注意,我没有重写paintComponent()
}
});
添加(testBox);
这个.add(testButton);
此.setVisible(true);
}
公共静态void createBox(){
GuiBox窗口=新的GuiBox(“测试盒”);
}
}
谢谢你们的帮助,伙计们

编辑--屏幕截图:

窗口:

Linux:

您发布的代码甚至没有使用您的自定义文本字段

如果您确实使用自定义文本字段,即使在Windows上也无法使用

this.setOpaque( false );
上面的语句表示组件不绘制自己的背景。因此,您将只看到父组件的背景


可能由于您的自定义边框,代码似乎正常工作,但文本组件本身不会绘制背景。

Nimbus LAF不支持设置JTextField背景颜色:


super.paintComponent()将清除背景。因此,在该语句之前完成的所有自定义绘制都将丢失。@camickr这是Linux上swing特有的吗?正如我所提到的,它在windows上工作,因此我会想象super.paintComponent()在这种情况下使用getBackground()作为颜色,但这里还有其他东西。此外,长方体仍然是一个圆角矩形,因此我无法想象它会完全清除它。另外,我忘了提到,这是SE8,如果这有什么区别的话。不过,谢谢你!忽略我的第一条评论,这是错误的。我在Linux上也看到了这个问题。Drayux有什么解决方案吗?不幸的是,这仍然不起作用。正如我在文章中提到的(如果不够清楚,请抱歉),第二块代码是一个独立的程序,可以工作,因此我可以得出结论,问题出在我的自定义文本字段中的某个地方。我很快会在这里添加一些屏幕截图,但是在使用setOpaque(false)的窗口上仍然存在着色。我可能错了,但我知道,在超类绘制组件中将其设置为不绘制自己的背景正是我想要的,因此我可以像我一样绘制自己的背景。
this.setOpaque( false );