1

Java 中有几个组件具有预定义的外观和自动打印的文本字符串。示例是 JFileChooser。

此外,当您尝试在 JFileChooser 中进行非法重命名时,会弹出一个 JDialog(或 JOptionPane)...

在哪些 *.java 文件中可以对表示该键的键进行字符串化,以及它们从哪里获取值?

我说的是 Nimbus L&F……我无法在 Nimbus 或 Synth 中找到它们(这并不一定意味着它们不存在)……我确实在 BasicFileChooser 中找到了 JFileChooser 字符串。

底线:我正在翻译我的程序,我不想要任何惊喜,所以我想知道哪些组件具有预定义的字符串以及在哪里可以找到它们,尤其是上面的 JDialog...

编辑:我找到了 BasicFileChooserUI,这是其中一种方法:

protected void installStrings(JFileChooser fc) {

    Locale l = fc.getLocale();
    newFolderErrorText = UIManager.getString("FileChooser.newFolderErrorText",l);
    newFolderErrorSeparator = UIManager.getString("FileChooser.newFolderErrorSeparator",l);

    newFolderParentDoesntExistTitleText = UIManager.getString("FileChooser.newFolderParentDoesntExistTitleText", l);
    newFolderParentDoesntExistText = UIManager.getString("FileChooser.newFolderParentDoesntExistText", l);

    fileDescriptionText = UIManager.getString("FileChooser.fileDescriptionText",l);
    directoryDescriptionText = UIManager.getString("FileChooser.directoryDescriptionText",l);

    saveButtonText   = UIManager.getString("FileChooser.saveButtonText",l);
    openButtonText   = UIManager.getString("FileChooser.openButtonText",l);
    saveDialogTitleText = UIManager.getString("FileChooser.saveDialogTitleText",l);
    openDialogTitleText = UIManager.getString("FileChooser.openDialogTitleText",l);
    cancelButtonText = UIManager.getString("FileChooser.cancelButtonText",l);
    updateButtonText = UIManager.getString("FileChooser.updateButtonText",l);
    helpButtonText   = UIManager.getString("FileChooser.helpButtonText",l);
    directoryOpenButtonText = UIManager.getString("FileChooser.directoryOpenButtonText",l);

    saveButtonMnemonic   = getMnemonic("FileChooser.saveButtonMnemonic", l);
    openButtonMnemonic   = getMnemonic("FileChooser.openButtonMnemonic", l);
    cancelButtonMnemonic = getMnemonic("FileChooser.cancelButtonMnemonic", l);
    updateButtonMnemonic = getMnemonic("FileChooser.updateButtonMnemonic", l);
    helpButtonMnemonic   = getMnemonic("FileChooser.helpButtonMnemonic", l);
    directoryOpenButtonMnemonic = getMnemonic("FileChooser.directoryOpenButtonMnemonic", l);

    saveButtonToolTipText   = UIManager.getString("FileChooser.saveButtonToolTipText",l);
    openButtonToolTipText   = UIManager.getString("FileChooser.openButtonToolTipText",l);
    cancelButtonToolTipText = UIManager.getString("FileChooser.cancelButtonToolTipText",l);
    updateButtonToolTipText = UIManager.getString("FileChooser.updateButtonToolTipText",l);
    helpButtonToolTipText   = UIManager.getString("FileChooser.helpButtonToolTipText",l);
    directoryOpenButtonToolTipText = UIManager.getString("FileChooser.directoryOpenButtonToolTipText",l);
}

我想知道从哪里getString("FileChooser.updateButtonText",l)提取字符串的方法...我尝试寻找它,但没有运气...另外,我知道 JFileChooser 中有一些字符串未在 BasicFileChooserUI.java 中定义...

4

3 回答 3

2

你想换哪一个,但我现在不知道答案

在此处输入图像描述

迪姆???

在看:

文件名:

文件类型:

import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;

class ChooserFilterTest {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                String[] properties = {"os.name", "java.version", "java.vm.version", "java.vendor"};
                for (String property : properties) {
                    System.out.println(property + ": " + System.getProperty(property));
                }
                JFileChooser jfc = new JFileChooser();
                jfc.showOpenDialog(null);
                jfc.addChoosableFileFilter(new FileFilter() {

                    @Override
                    public boolean accept(File f) {
                        return f.isDirectory() || f.getName().toLowerCase().endsWith(".obj");
                    }

                    @Override
                    public String getDescription() {
                        return "Wavefront OBJ (*.obj)";
                    }

                    @Override
                    public String toString() {
                        return getDescription();
                    }
                });
                int result = JOptionPane.showConfirmDialog(null, "Description was 'All Files'?");
                System.out.println("Displayed description (Metal): " + (result == JOptionPane.YES_OPTION));
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    SwingUtilities.updateComponentTreeUI(jfc);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                jfc.showOpenDialog(null);
                result = JOptionPane.showConfirmDialog(null, "Description was 'All Files'?");
                System.out.println("Displayed description (System): " + (result == JOptionPane.YES_OPTION));
                result = JOptionPane.showConfirmDialog(null, "Description was 'All Files'?");
                System.out.println("Displayed description (Metal): " + (result == JOptionPane.YES_OPTION));
                try {
                    for (UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            SwingUtilities.updateComponentTreeUI(jfc);
                            break;
                        }
                    }
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                }
                jfc.showOpenDialog(null);
                result = JOptionPane.showConfirmDialog(null, "Description was 'All Files'?");
                System.out.println("Displayed description (System): " + (result == JOptionPane.YES_OPTION));
            }
        };
        SwingUtilities.invokeLater(r);
    }

    private ChooserFilterTest() {
    }
}

你想要这个吗

在此处输入图像描述

从代码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.*;
import javax.swing.plaf.metal.MetalButtonUI;

public class CrazyFileChooser {

    public static void main(String[] args) {
        try {
            for (UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
        } catch (InstantiationException ex) {
        } catch (IllegalAccessException ex) {
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        }


        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new CrazyFileChooser().makeUI();
            }
        });
    }

    public void makeUI() {
        JFileChooser chooser = new JFileChooser();
        for (AbstractButton button : SwingUtils.getDescendantsOfType(AbstractButton.class, chooser)) {
            button.setUI(new XORButtonUI());
            button.setForeground(Color.GREEN);
        }
        for (JList list : SwingUtils.getDescendantsOfType(JList.class, chooser)) {
            list.setBackground(Color.PINK);
        }
        JTextField jTextField = SwingUtils.getDescendantOfType(JTextField.class, chooser, "Text", "");
        jTextField.setEditable(false);
        for (JLabel label : SwingUtils.getDescendantsOfType(JLabel.class, chooser)) {
            label.setFont(new Font("Dialog", Font.ITALIC, 18));
            label.setForeground(Color.RED);
        }
        chooser.showOpenDialog(null);
    }
}

class XORButtonUI extends MetalButtonUI {

    @Override
    public void paint(Graphics g, JComponent c) {
        g.setXORMode(Color.YELLOW);
        super.paint(g, c);
    }
}

基于代码Swing Utils,由顶级 Swing 大师之一 Darryl Burke 编写(曾经告诉我们,要付钱给我编程,是如何付钱给小孩舔冰淇淋)

于 2012-09-20T21:12:38.163 回答
2

许多此类用户界面元素已针对支持的语言进行了本地化,如JDK 6 和 JRE 6 Supported Locales: User Interface Translation中所示。

附录:另见国际化:了解 Java 平台中的语言环境UIManager.getLookAndFeelDefaults()未指定获取 L&F 默认值的方式;不支持更改源数据。返回的属性的(非本地化)名称Map可用于覆盖默认值。如如何编写自定义外观中所述,源文本存储在每个 L&F 和每个支持的语言环境的属性文件中。QuaQua就是一个例子。例如,在我的平台上,英文字符串com.apple.laf.AquaLookAndFeel

$JAVA_HOME/Resources/English.lproj/aqua.properties

警告:

# 当这个文件被读入时,字符串被放入
# 默认表。这是当前的实现细节
# Swing 的工作原理。不要依赖于此。这可能会改变
# 随着我们改进本地化支持,Swing 的未来版本。

另请参阅如何JFileChooser为默认不支持的语言环境添加本地化?

于 2012-09-20T20:30:31.977 回答
1

这些密钥由 Swing PLAF 资源包提供,您可以在 JDK 源代码中找到它们。参见例如:

非英语语言的字符串值由相邻的捆绑文件提供。

您只需为所需的人类语言再创建一个文件并将其放置在类路径中的任何位置,就可以为这些系列中的任何一个再添加一个包。.java 和 .properties 格式的捆绑包同样工作良好,尽管 .java 格式可能对 Unicode 更友好...

com.sun尽管直接将内容添加到包中可能会违反 Java 许可证,但请记住这一点可能会很好。所以为了安全起见,将你的额外资源移动到你自己的包中并像这样注册它可能是明智的UIManager

UIManager.getDefaults().addResourceBundle("mypackage.swing.plaf.basic.resources.basic");

至于 Nimbus,我没有找到任何特殊资源,所以使用“基本”可能会完成这项工作......

于 2016-03-31T05:39:20.280 回答