Используйте хеш-таблицу, вектор или HashMap или ArrayList в Java

boardBckg.add(boardPanel, BorderLayout.CENTER);

Макетом JPanel по умолчанию является FlowLayout. Вы не можете просто указать ограничение BorderLayout при добавлении компонента на панель.

frame.add(boardBckg);
frame.add(menuPanel);

Макетом по умолчанию для (области содержимого) фрейма является BorderLayout. Если вы не укажете ограничение, компонент будет добавлен в BorderLayout.CENTER. Проблема в том, что в CENTER может быть добавлен только один компонент, поэтому вы видите только последний добавленный компонент.

frame.setVisible(true);

Компонент должен быть добавлен в кадр ДО того, как кадр будет упакован и сделан видимым. Таким образом, приведенное выше утверждение должно быть последним в вашем конструкторе.

Я понятия не имею, какой у вас желаемый макет, но вам нужно начать с чего-то простого и воспользоваться преимуществами BorderLayout по умолчанию.

Итак, ваша базовая логика может выглядеть примерно так:

JPanel menuPanel = new JPanel()
menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS));
menuPanel.add(...);
menuPanel.add(...);

JPanel center = new JPanel();
center.setLayout(...);
center.setBackground( Color.BLUE );
center.add(...);

frame.add(menuPanel, BorderLayout.LINE_START);
frame.add(center, BorderLayout.CENTER);
frame.pack();
frame.setVisible( true );

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

13
задан Berlin Brown 17 January 2009 в 17:45
поделиться

6 ответов

Проблема с Вектором и Хеш-таблицей состоит в том, что они только локально синхронизируются. Они не повредятся (как в поврежденных данных) в параллельном приложении, однако, из-за локальной синхронизации (например, доберутся, синхронизируется, но только пока не получат возвраты), Вы будете желать выполнить свою собственную синхронизацию так или иначе для ситуаций, таких как повторение по содержанию. Теперь, даже для Вашего посаженного метода нужна некоторая дополнительная синхронизация для сотрудничества с итеративной синхронизацией, и Вы заканчиваете с ситуацией, где Ваша Хеш-таблица/Вектор вдвойне синхронизируется.

17
ответ дан 1 December 2019 в 17:25
поделиться

ConcurrentHashMap является путем быстрее, чем Хеш-таблица. Это параллельно, не просто синхронизировался. Это допускает несколько читателей/устройств записи сразу.

Нет такого 'параллельного' списка массива все же. В зависимости от Ваших потребностей CopyOnWriteArrayList может или не может быть тем, в чем Вы нуждаетесь.

17
ответ дан 1 December 2019 в 17:25
поделиться

Синхронизация имеет свое место, но это не единственная разница между Vector и ArrayList. Vector выращивает его массив внутренней памяти установленной суммой каждый раз, когда она превышает свою способность, в то время как ArrayList выращивает его фиксированным фактором, который обычно является намного лучшим подходом (так как это дает амортизируемую стоимость O (1) для добавления объекта).

Также отметьте это Collections.synchronizedList() может использоваться для создания синхронизируемого представления о любом List реализация, таким образом, Вы не должны быть связаны с характеристиками Vector (Вы могли бы хотеть синхронизируемый LinkedList например).

8
ответ дан 1 December 2019 в 17:25
поделиться

При необходимости в синхронизируемом ArrayList или HashMap можно перенести их.

List list = Collections.synchronizedList(new ArrayList(...));
Map m = Collections.synchronizedMap(new HashMap(...));

Лично я нахожу "синхронизируемые" методы в этих наборах не очень полезными в тяжелом потоковом коде. Существуют некоторые более новые наборы, которые помогают намного больше, но главным образом я делаю свое собственное, синхронизируют объекты и синхронизирующийся вокруг них или использующий новые блокировки в java.util.concurrent

13
ответ дан 1 December 2019 в 17:25
поделиться

Можно использовать статические методы Наборов для преобразования Списка или Карты в синхронизируемую версию: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedList (java.util. Список)

В целом обычно необходимо блокировать для больше что отдельный вызов к списку или карте.

3
ответ дан 1 December 2019 в 17:25
поделиться

Мне кажется, что единственные времена, Вам был бы нужен сам Набор, чтобы быть ориентированными на многопотоковое исполнение:

  • Если Набор видим снаружи класса (Общедоступный или объем по умолчанию)
  • Если Вы возвращаете дескриптор набору из метода
  • Если набор является статическим членом Вашего класса

Все те являются, вероятно, плохими мудрыми дизайном идеями.

Лучший подход должен был бы сделать сам набор Частным или Защищенным, и получить доступ к нему через синхронизированные методы. В случае статического участника, если бы у Вас была потребность сделать это, Singleton была бы лучшим способом пойти.

0
ответ дан 1 December 2019 в 17:25
поделиться
Другие вопросы по тегам:

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