Swing JPanel не перекрасит

У меня есть простой объект, который расширяется JPanel, когда update() метод называют на этом объекте им, это означало добавлять некоторые маркировки к панели и затем перекрашивать. Однако маркировки не обнаруживаются после того, как метод обновления называют, ниже код для обновления:

public void update(){
        GridBagConstraints constraints = new GridBagConstraints();

        if(cardsHidden){
            for(int i = 0; i < 2; i++){
                constraints.gridx = i;
                constraints.gridy = 0;
                JLabel card = new JLabel(PlayingCards.cardImages[PlayingCards.CARD_BACK_INDEX]);
                add(card, constraints);
            }
        }
        else{
            Card[] holeCards = player.getHoleCards();
            for(int i = 0; i < holeCards.length; i++){
                constraints.gridx = i;
                constraints.gridy = 0;
                JLabel card = new JLabel(holeCards[i].getImageIcon());
                add(card, constraints); 
            }
        }

        validate();
        repaint();
    }

какие-либо идеи?

Спасибо

Править

решенный:

Оказывается что HoleCardsPanel не добавлял к его родительскому кадру правильно. После того как это было зафиксировано добавление новых JLabels хорошо работает. Я также:

  • добавленный вызов к update() метод к событию диспетчеризирует использование потока SwingUtillities.invokeLater
  • должен был звонить validate() от верхнего компонента (в этом случае JFrame) поскольку Devon_C_Miller предлагает в его ответе.

8
задан Cœur 13 June 2018 в 05:06
поделиться

6 ответов

Вы можете попробовать позвонить , метод updateui () .

2
ответ дан 5 December 2019 в 04:42
поделиться

Пытались ли вы попробовать SetVisible() на метках ?

Пытались ли вы добавить объекты при инициализации без обновления ? Если они не появятся там, они никогда не появятся.

0
ответ дан 5 December 2019 в 04:42
поделиться

Попробуйте позвонить Revalidate (); Перекрашивать не то, что вы хотите.

Согласно:

Документы API

Примечание: если компонент был добавлен к Контейнер, который был отображен, проверка должна быть вызвана Контейнер для отображения нового составная часть. Если несколько компонентов быть добавленным, вы можете улучшить Эффективность, вызывая только проверку один раз, после того, как все компоненты имеют был добавлен.

Revalidate () в основном является недействительным (), а затем проверяют ().

См. Это Вопрос .....

14
ответ дан 5 December 2019 в 04:42
поделиться

Вам придется поменять несколько вещей, что-то похожее на следующее.

Вот пример, вам нужно будет изменить это, чтобы удовлетворить свою цель, но это показывает разницу.

Я также рекомендую использовать оператор «Использование» для управления соединением / считывателем. Также параметризованный запрос.

Dim sConnection As String = "server=(local);uid=sa;pwd=PassWord;database=DatabaseName"

Dim objCommand As New SqlCommand
objCommand.CommandText = "Select * From tablename"
objCommand.Connection = New SqlConnection(sConnection)
objCommand.Connection.Open()

Dim objDataReader As SqlDataReader = objCommand.ExecuteReader()

If objDataReader.HasRows Then
Do While objDataReader.Read()
Console.WriteLine(" Your name is: " & Convert.ToString(objDataReader(0)))
Loop
Else
Console.WriteLine("No rows returned.")
End If

objDataReader.Close()
objCommand.Dispose()
-121--3095783-

Вызов на Validate () должен работать, хотя может быть достаточным () ; Необходимо не обязательно () . Вы можете сравнить, что вы делаете с этим Примером , что делает динамический GridBaglayout .

5
ответ дан 5 December 2019 в 04:42
поделиться

Это зависит от того, что вы хотите произойти, и какие руководители макета используются, но основные правила являются:

  1. Убедитесь, что на EDT вызывается . Если это не ( Handutitivities.iseventdispatchThread () Возвращает false) Вам нужно будет использовать Handutivilities.invokelater , чтобы запланировать обновление на EDT. Например:

     Handutivilities.invokelater (новый родительский () {
      Public Void Run () {
      Обновить();
      }});
     
  2. Вызов недействителен () . Большинство вещей, которые изменяют компонент, сделают это для вас. Поэтому вам нужно только назвать это, если следующее не работает самостоятельно.

  3. Вызов Validate () на уровне на самом высоком уровне . Это, вероятно, грязный бит цикла рендеринга Java. Призыв к Invalidate отмечает компонент и все его предки как нуждающийся в макете. Призыв к проверяет . Выполняет макет компонента и все его потомков . Один работает «вверх», а другие работы «вниз». Вам необходимо позвонить Validate на самом высоком компоненте в дереве, которое будет влиять на ваши изменения.

    Кроме того, вызов Validate на компоненте верхнего уровня (JWindow, JDialog, JFrame) не обязательно не оценит этот компонент. Чтобы это произошло, вам нужно позвонить Pack () или STATSIZE () .

  4. Если ваши изменения изменяются размер или положение контейнеров, измененные контейнеры будут перекрасить, но они не будут стирать пространство , используемое для . Призвание Reppreat () На родителях контейнера приведет к нему перекраску фона, исправляя повреждение.

22
ответ дан 5 December 2019 в 04:42
поделиться

Поскольку каждый из ответов и комментариев дает полезную информацию. Я только что составил, все ответы и комментарии в один пост.

Я просто интересовался, возможно ли это для замены загрузчика (исполняемая программа загрузчик не загрузчик) Операционная система (Windows - моя выбор).

Нет, в процессе создания окон загрузчик пользовательского режима в ntdll связаны друг с другом (PsCreateProcess будет непосредственно отображаться в ntdll и переходить к нему, чтобы он мог завершить разрешение модулей и настройку процесса), вы не можете заменить его.

, но имеются доступные ресурсы, описывающие формат и загрузку процессов.

Вот довольно старая, но все еще актуальная статья MSDN относительно файлов PE (exe + dll)

  1. Первая часть. Всесторонний Взгляд в Портативный Исполняемый файл Win32 Формат Мэтта Пьетрека (MSDN) Журнал, февраль 2002)
  2. вторая часть. Всесторонний взгляд в портативный исполняемый файл Win32 Формат Мэтта Пьетрека (MSDN) Журнал, март 2002)

Эту информацию можно использовать для создания приложения, запускающего данный исполняемый файл.

Если вас больше интересует linux и эльфийский формат, вы найдете все необходимое в google.

Есть ли способ, с помощью которого я могу получить контроль над загрузчиком ОС? Я имею в виду, я хочу то, что он делает с быть видимым для меня (каждый шаг).

В Windows можно получить некоторое представление о загрузчике при работе, включив функцию «Привязка загрузчика». Это можно сделать с помощью gflags.exe (часть инструментов отладки для Windows). Есть хороший gflags.exe ссылка http://www.osronline.com/DDKx/ddtools/gflags_4n77.htm . Если включена функция «Показать снимки загрузчика», можно просмотреть сообщения трассировки загрузчика, запустив приложение под отладчиком (WinDBG).

Если вы хотите играть с такого рода вещи, то Linux является лучшим способом для перехода.

Загрузчик является частью kernal - но, поскольку у вас есть доступ ко всему материнскому источнику, вы можете играть с ним до ваших сердец содержание.

Загрузчики для различных двоичных форматов находятся в fs/binfmt _ * .c в источнике Linux ( fs/binfmt _ elf.c - загрузчик, используемый для исполняемых файлов в формате ELF - т. е. подавляющее большинство).

Динамический загрузчик /lib {, 64 }/ld-linux.so.2 также используется для динамически связанных двоичных файлов - это пример «интерпретатора», на который ссылается код в binfmt_elf.c.

Linux имеет подключаемые форматы исполняемых файлов, поэтому можно добавить дополнительный загрузчик программ, который будет выполнять свои собственные функции с исполняемыми файлами, а не стандартными (ELF, сценарии оболочки, binfmt_misc).

Модуль binfmt _ misc позволяет записывать пользовательские загрузчики для исполняемых программ полностью в пользовательском пространстве; обычно используется для выполнения неродных двоичных файлов или интерпретируемых двоичных файлов, таких как Java, исполняемые файлы CLR и т.д.

С другой стороны, если вы хотите заменить ELF-загрузчик чем-то другим, вы можете создать модуль binfmt непосредственно в ядре. Примеры см. в разделе fs/binfmt _ * . Сам ЭЛФ-погрузчик там.

-121--4213447-

Некоторые распространенные применения можно найти в Literals Class as Runtime-Type Tokens .

-121--1016082-

Оказалось, что HureCardsPanel не может добавить в родительский кадр должным образом, после того, как это было исправлено, добавление нового JLabels работает нормально. Я добавил вызов метода update () к потоку отправки событий с помощью SwingUtillities.invokeLater Мне пришлось дополнительно вызвать validate () из самого верхнего компонента (в данном случае JFrame )

0
ответ дан 5 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: