• Как очистить панель JPanel?

    @MaxLich
    java developer
    Попробуйте сначала вызывать метод removeAllItems(), а потом repaint() и revalidate(). Насколько помню, у меня так работало (именно эти три метода, и именно в таком порядке).
    Ответ написан
    1 комментарий
  • Как отобразить иерархию должностей в виде дерева для Swing JTree?

    @MaxLich
    java developer
    Можете глянуть мою прогу на гитхабе: ссылка
    Собственно код с функцией добавления узлов в модель:
    код
    public class MainModel extends Model {
        private String extensionOfFiles;
        private String textToFind;
        private boolean matchCase;
    
        @Override
        public void loadFileTree(Path sourceDir, String extensionFiles, String textToFind, boolean matсhCase) {
    
            this.extensionOfFiles = extensionFiles;
            this.textToFind = textToFind;
            this.matchCase = matсhCase;
    
            DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(sourceDir,true);
    
            addChildrenNodes(rootNode,sourceDir);
            deleteAllEmptyBranches(rootNode);
    
            TreeModel treeModel = new DefaultTreeModel(rootNode,true);
    
            setChanged();
            notifyObservers(treeModel);
        }
    
        //ищет и добавляет "детей" узлам дерева
        private void addChildrenNodes(DefaultMutableTreeNode rootNode, Path sourceDir) {
            try (DirectoryStream<Path> stream = Files.newDirectoryStream(sourceDir)) {
                for (Path path: stream) {
                    if (Files.isRegularFile(path)) {
                        String fileName = path.getFileName().toString().toLowerCase(); //имя файла в нижнем регистре
                        if (fileName.endsWith("."+extensionOfFiles) && isFileContainsText(path)) //если файл имеет нужное расширение и содержит искомый текст
                            rootNode.add(new DefaultMutableTreeNode(new PathContainer(path),false)); //то добавляет его в дерево
                    } else if (Files.isDirectory(path)) {
                        File[] listFiles = path.toFile().listFiles();
                        if (listFiles == null || listFiles.length == 0) continue;
                        DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(new PathContainer(path), true);
                        rootNode.add(newChild); //добавляем папку в дерево
                        addChildrenNodes(newChild,path); //рекурсивный вызов метода с данной папкой и данным узлом в качестве параметров
                    }
                }
            } catch (IOException | DirectoryIteratorException x) {
                System.err.println(x);
            }
        }
    
        //метод проверяет, содержит ли файл  искомый текст
        private boolean isFileContainsText(Path file) throws IOException {
            try {
                List<String> fileContent = Files.readAllLines(file);
                if (matchCase) {
                    for (String str : fileContent) {
                        if (str.contains(textToFind)) {
                            return true;
                        }
                    }
                } else {
                    for (String str : fileContent) {
                        if (str.toLowerCase().contains(textToFind.toLowerCase())) {
                            return true;
                        }
                    }
                }
            } catch (MalformedInputException e) {}
    
            return false;
        }
    
        //метод очищает дерево от пустых веток (содержащих одни пустые каталоги)
        private void deleteAllEmptyBranches(DefaultMutableTreeNode currNode) {
            if (currNode == null) return;
            Enumeration<DefaultMutableTreeNode> children = currNode.children();
            if (children == null || !children.hasMoreElements()) return;
    
            Queue<DefaultMutableTreeNode> queue = new LinkedList<>();
    
            while (children.hasMoreElements()) {
                DefaultMutableTreeNode child = children.nextElement();
                if (child.getAllowsChildren())    //если это каталог, то добавляем его в очередь
                    queue.add(child);
            }
    
            while (!queue.isEmpty()) {
                DefaultMutableTreeNode node = queue.poll();
                if (node == null)  continue;
                if (node.getAllowsChildren()) {
                    if (node.isLeaf()) {
                        DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
                        node.removeFromParent();
                        if (queue.contains(parent) || parent == null) continue; // если родитель этого узла уже есть в очереди
                                                                                // или он равен нулл, то ничего не делаем
                        queue.offer(parent); //иначе добавляем его в очередь
                    } else {
                        children = node.children();
                        while (children.hasMoreElements()) {
                            DefaultMutableTreeNode child = children.nextElement();
                            if (child.getAllowsChildren() && !queue.contains(child))    // если это каталог и его ещё нет в очереди, то...
                                queue.add(child);                         // добавляем его в очередь
                        }
                    }
                }
            }
    
    
        }
    }
    Ответ написан
    Комментировать
  • Не работает сторонняя бибиотека в сборке, как исправить?

    @MaxLich
    java developer
    Перейти на нормальную систему сборки, которая сама разрешает зависимости (мейвен или грейдл)
    Ответ написан
    Комментировать
  • Легкий вопрос по теории ООП. Создание экземпляра класса в этом же классе?

    @MaxLich
    java developer
    Такое применяется в некоторых паттернах (синглтон, фабрика и прочее), также для тестирования класса можно в нём объявлять метод main() и в теле этого метода создавать экземпляр этого класса и работать с ним. Но это больше подходит для небольшого тестирования (разового) и для небольших учебных программ, в серьёзных продакшн-проектах так делать не нужно.
    Ответ написан
    Комментировать
  • Вывод данных со всех листов наследниках?

    @MaxLich
    java developer
    Пока приходит в голове такое: объявить лист в суперклассе, в наследниках его заполнять. В каком-то внешнем классе (который не входит в эту иерархию) создать список наследников суперкласса, и потом в цикле всех их перебирать и добавлять элементы из их списков в общий список.

    ЗЫ Единственное тут возникает вопрос с типами элементов. Если для всех товаров используется один класс (то есть у них у всех одинаковые характеристики), то можно сразу список и типизировать этим классом. Иначе можно сделать суперкласс дженериком, и в каждом наследнике определять тип товара; правда, тогда все типы товаров должны иметь общего наследника (или общий интерфейс), т.д.. ...
    Ответ написан
    Комментировать
  • Английский для программиста или на что лучше ставку сделать?

    @MaxLich
    java developer
    Моё мнение, что в таком положении лучше уже уделить всё время программированию. Английский можно как-нибудь потом подтянуть. Либо параллельно его потихоньку изучать (использую тот же Lingvo Leo или Duo Lingua). В небольшие конторы, которые работают с местными фирмами, можно и без английского устроиться.

    ЗЫ Кроме того, в некоторых фирмах есть преподаватели по английскому, и его можно подтянуть сразу там, на работе.
    ЗЫЫ Конечно, ещё зависит от выбранного ЯП и области применения. Где-то вся информация - только на английском, где-то - почти всё, что нужно - на русском.
    Ответ написан
    Комментировать
  • Написание программы для автоматизации работы магазина?

    @MaxLich
    java developer
    с декомпозиции предметной области
    Ответ написан
    Комментировать
  • Почему так работает побитовый сдвиг?

    @MaxLich
    java developer
    В первом случае происходит переполнение, поэтому получается отрицательное число, а вот по второму случаю сходу так ничего не могу сказать.
    Ответ написан
    Комментировать
  • Как прописывать пути к шрифтам и картинкам в файлах шаблонов JasperReports?

    @MaxLich Автор вопроса
    java developer
    Помог такой путь: "config/font/ARIAL.TTF", правда, файл находится в главном проекте, что не очень логично и удобно. Но в той папке уже был какой-то шрифт, значит, такое уже практикуется (проект не мой, я на такой пришёл).
    Ответ написан
    Комментировать
  • Как правильно работать с данными из файла?

    @MaxLich
    java developer
    Ещё добавлю, что данные лучше хранить в базе, а не в файлах.
    Ответ написан
    Комментировать
  • Как в Swing получать ширину кнопки выпадающего списка JComboBox?

    @MaxLich Автор вопроса
    java developer
    В итоге решил свою проблему, вызывая метод "public void setPrototypeDisplayValue(E prototypeDisplayValue)" у объекта классы JComboBox. Это конечно, не ответ на вопрос, который я задал, но позволяет решить изначальную проблему, из-за которой мне и пришлось задать этот вопрос.
    Ответ написан
    Комментировать
  • Какие компании в СПб проводят тренинги и стажировки?

    @MaxLich
    java developer
    Несколько месяцев назад, когда тоже искал работу, видел какую-то статью, где были собраны все фирмы, у которых есть стажировка и тренинги, но что-то сейчас не могу найти. Могу только предложить такие статьи: первая и вторая
    Ответ написан
    2 комментария
  • Философия Java - что дальше?

    @MaxLich
    java developer
    Если чисто по новым особенностям языка, то можно ещё (кроме того, что описал Сергей Горностаев) почитать книжки Хорстманна (последнее издание библиотеки профессионала, а также его книги чисто по Java 8). А если вообще - то "Эффективное программирование" Джошуа Блоха.
    Ответ написан
    Комментировать
  • Какую винду выбрать на такой ноут: 7, 8 или 10?

    @MaxLich
    java developer
    Сначала нужно посмотреть, есть ли драйвера на это железо, а дальше уже смотреть. Но, моё мнение - ставить 10.
    Ответ написан
    Комментировать
  • Как скомпилировать программу на JAVA в Eclipse?

    @MaxLich
    java developer
    Я бы лучше начал с хеллоу ворлда. И дальше уже писал всё более сложные и сложные программы. А вообще - лучше просто взять хорошую книгу по джаве (или курсы какие нормальные пройти, но книгу всё равно прочитать придётся). В книге как раз будет идти обучение от простого к сложному - само то.
    Ответ написан
  • Почему значение final можно изменять?

    @MaxLich
    java developer
    Нельзя менять final-поля после создания объекта, но можно и нужно их менять (задавать им значения) во время создания объекта. Так что тут никаких проблем нет. Во время создания объекта, перед вызовом конструктора, инициализируются все поля, в том числе и данное поле id.
    Ответ написан
    Комментировать
  • Gradle-проект не публикуется в локальный Maven-репозиторий из-за того, что в исходных кодах использует русский текст. Как это исправить?

    @MaxLich Автор вопроса
    java developer
    Нужно дописать в build.gradle следующее:
    tasks.withType(Javadoc) { options.encoding = 'UTF-8' }
    Ответ написан
    Комментировать
  • Какой учебник по Android Вы посоветуете?

    @MaxLich
    java developer
    Ещё на джавараш есть переведённый бесплатный курс https://javarush.ru/quests/QUEST_GOOGLE_ANDROID но не уверен, что там по последнему андроиду
    Ответ написан
    Комментировать
  • Java - с чего начать?

    @MaxLich
    java developer
    Можно почитать Хорстманна, а потом Эккеля. Но без своих проектов совсем туго. Так же с некоторого времени нужно начинать изучать, как выше указали, Спринг, Хибернейт, сборщики проектов, СКВ, а также разработку веб-приложений.

    ЗЫ Да, конечно, курсы - это круто. Тот же Джавараш (сам прошёл и доволен, хотя его одного мало, очень мало), или ещё много других. Но тут каждый решай сам, как ему лучше и удобнее.
    Ответ написан
    Комментировать