我正在使用 Java Swing 应用程序,并面临自定义 JFileChooser 组件的挑战。具体来说,我需要更改用于在 JFileChooser 中编辑文件或文件夹名称的 JTextField 的背景颜色。
JFileChooser中的文件和文件夹列表由JList表示,据我所知,它不提供访问或修改单元格编辑器的直接方法。
我尝试重写 DefaultListCellRenderer 的 getListCellRendererComponent() 方法来实现此目的,但此方法不允许我访问 JTextField 组件。
有没有办法在 JFileChooser 中自定义 JTextField 来编辑文件或文件夹名称,特别是更改其背景颜色?
所讨论的 JTextField 是
editCell
。你可以通过反射来获取它,但我认为这不是一个好主意。
这是一个粗略的原型(目前只有第二个选择正确设置了背景):
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileSystemView;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.Field;
public class Demo {
private Demo() {
JFrame jframe = new JFrame("Test");
JButton button = new JButton("Click me");
final JFileChooser fc = new JFileChooser();
fc.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
Object filepane = fc.getComponent(2);
try {
Field field = filepane.getClass().getDeclaredField("editCell");
field.setAccessible(true);
JTextField textfield = (JTextField) field.get(filepane);
if (textfield != null) {
textfield.setBackground(Color.yellow);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
});
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int returnVal = fc.showOpenDialog((Component) e.getSource());
}
});
jframe.add(button, BorderLayout.CENTER);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.pack();
jframe.setSize(400, 300);
jframe.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Demo();
}
});
}
}
如果您使用高于 Java 9 的 SDK,您还需要在运行配置中使用 sun.swing.* 中的包:
--add-opens=java.desktop/sun.swing=ALL-UNNAMED