javax.swing.UIManager.getIcon (Object key) возвращает ноль, когда String-ключи передаются из ArrayList - PullRequest
0 голосов
/ 21 марта 2020

Чего я хочу достичь: Я хочу визуализировать некоторые javax.swing.Icon s из javax.swing.UIManager. На inte rnet я нашел список UIManager -ключей, которые будут возвращать не только Icons, но также Strings, Colors и так далее. Итак, на этом шаге я хочу отфильтровать список ключей, чтобы остались только клавиши Icon.

Мой подход: Я скопировал список ключей UIManager в текстовый файл и включил его в качестве источника в мой Java -Проект. Я успешно прочитал файл, поэтому разделил содержимое файла по строкам и добавил их к ArrayList из Strings. Теперь я хотел передать содержимое этого ArrayList и отфильтровать ключи по методу UIManager.getIcon(Object key) -Метод возвращает null или нет ...

Моя проблема : UIManager всегда возвращает null. Я распечатал все ключи и результат UIManager на консоли ( см. «Вывод / проверка - ключи потока» в моем коде ). Если я вручную скопирую ключ из консоли (который, как я знаю, должен работать) и вставлю его в точно такой же кусок кода, он действительно работает ( см. «Вывод / проверка - один ключ» в моем коде ).

Интересное поведение показывает, когда я добавляю String к ключу, который я хочу распечатать на консоли ( См. Переменную «суффикс» в разделе «Вывод / проверка»). - Ключи потока "в моем коде ). Если переменная suffix не начинается с "\ n", следующий метод print в потоке будет печатать только suffix и больше не отображать другое содержимое. Например, если я наберу String suffix = "test";, из * 1041 будет напечатан только «test». Однако это поведение не отображается в примере «Вывод / проверка - один ключ».

У меня нет Идея, что происходит или если (на мой взгляд) странное поведение как-то связано с проблемой. Я ценю любую помощь!

Пьеса из "UIManagerKeys.txt": Вот несколько ключей для целей тестирования и воспроизводимости ...

FileView.computerIcon
FileView.directoryIcon
FileView.fileIcon
FileView.floppyDriveIcon
FileView.hardDriveIcon
FormattedTextField.background
FormattedTextField.border
windowText

Мой код:

package main;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.UIManager;

public class Main {

    public Main() {
    }

    public static void main(String args[]) {
        ArrayList<String> uiKeys = new ArrayList<>();
        String fileName = "recources/UIManagerKeys.txt";
        ClassLoader classLoader = new Main().getClass().getClassLoader();

        File file = new File(classLoader.getResource(fileName).getFile());

        // Check: is File found?
        System.out.println("File Found : " + file.exists());

        try {
            // Read File Content
            String content = new String(Files.readAllBytes(file.toPath()));

            // Split by line and collect
            String[] keys = content.split("\n");
            uiKeys.addAll(Arrays.asList(keys));
        } catch (IOException e) {
            System.out.println("Error: " + e);
        }

        // Output / Test - stream Keys
        System.out.println("Total Number of Keys: " + uiKeys.size());
        String suffix = ""; // Interesting behavior when String is not empty
        uiKeys.stream()
                .map(key -> key.replaceAll(" ", "").replaceAll("\n", "")) // Just to be sure
                .forEach(key -> System.out.println("IconFound: " + (UIManager.getIcon(key) != null) + "\tKey: " + key + suffix));

        // Output / Test - single Key
        System.out.println("\n");
        String key = "FileView.directoryIcon"; // Copied from console
        System.out.println("IconFound: " + (UIManager.getIcon(key) != null) + "\tKey: " + key + suffix);
    }
}

1 Ответ

0 голосов
/ 21 марта 2020

Я хочу визуализировать некоторые javax.swing.Icons из javax.swing.UIManager.

Я скопировал список ключей UIManager в текстовый файл

Нет необходимости создавать текстовый файл. Вы просто получаете все свойства из UIManager и проверяете, является ли объект значком:

public static void main(String[] args) throws Exception
{
    UIDefaults defaults = UIManager.getLookAndFeelDefaults();

    for ( Enumeration enumm = defaults.keys(); enumm.hasMoreElements(); )
    {
        Object key = enumm.nextElement();
        Object value = defaults.get( key );

        if (value instanceof Icon)
            System.out.println( key );
    }
}

В inte rnet Я нашел список ключей UIManager,

Проверьте: UIManager По умолчанию для небольшого графического инструмента, отображающего все свойства.

Ваш подход к чтению файлов кажется немного сложным. Вот простой подход к чтению строк файла в ListArray:

import java.io.*;
import java.util.*;

public class ReadFile
{
    public static void main(String [] args) throws Exception
    {
        ArrayList<String> lines = new ArrayList<String>();

        BufferedReader in = new BufferedReader( new FileReader( "ReadFile.java" ) );
        String line;

        while((line = in.readLine()) != null)
        {
            lines.add(line);
        }

        in.close();

        System.out.println(lines.size() + " lines read");
    }
}
...