如何在 JFileChooser 中编辑 JTextField 背景以进行文件/文件夹名称编辑

问题描述 投票:0回答:1

我正在使用 Java Swing 应用程序,并面临自定义 JFileChooser 组件的挑战。具体来说,我需要更改用于在 JFileChooser 中编辑文件或文件夹名称的 JTextField 的背景颜色。

JFileChooser中的文件和文件夹列表由JList表示,据我所知,它不提供访问或修改单元格编辑器的直接方法。

我尝试重写 DefaultListCellRenderergetListCellRendererComponent() 方法来实现此目的,但此方法不允许我访问 JTextField 组件。

有没有办法在 JFileChooser 中自定义 JTextField 来编辑文件或文件夹名称,特别是更改其背景颜色?

swing jtextfield jlist jfilechooser
1个回答
0
投票

所讨论的 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
© www.soinside.com 2019 - 2024. All rights reserved.