Множество изображений JLabel

Я пытаюсь загрузить одно и то же изображение jlabel дважды в панель gridlayout, однако вместо создания двух экземпляров изображения изображение отображается только один раз, а затем перемещается.

Как сохранить одну и ту же позицию JLabel в массиве штук в нескольких JLabel в массиве boardLabels.

Благодаря 🙂

public static JPanel boardPanel = new JPanel(new GridLayout(4, 0)); public static JLabel pieces[] = new JLabel[2]; private static JLabel[] boardLabels = new JLabel[4]; public MainFrame() { pieces[0] = new JLabel(new ImageIcon(System.getProperty("user.dir") + "/images/piece1.png")); pieces[1] = new JLabel(new ImageIcon(System.getProperty("user.dir") + "/images/piece2.png")); this.add(boardPanel); displayGUIboard(); } public static void displayGUIboard() { //ERROR - the label in pieces[0] is not copied into both boardLabels [0] and [1] boardLabels[0] = pieces[0]; boardLabels[1] = pieces[0]; boardPanel.add(boardLabels[0]); boardPanel.add(boardLabels[1]); } public static void main(String[] args) { MainFrame frame = new MainFrame(); frame.setVisible(true); frame.setSize(600, 600); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } 

Это работает

  boardLabels[0] = new JLabel(pieces[1]); boardLabels[1] = new JLabel(pieces[1]); 

при использовании ImageIcons, но я хочу избежать этого, так как для обновления платы мне придется удалить, а затем перезагрузить JLabels. Я бы предпочел просто обновить уже загруженные метки.

edit Я пробовал это раньше, но он выбрасывает исключение нулевого указателя …

  boardLabels[0].setIcon(pieces[1]); boardLabels[1].setIcon(pieces[1]); boardPanel.add(boardLabels[0]); boardPanel.add(boardLabels[1]); 

Не делайте этого, так как вы не можете добавить один и тот же компонент более одного раза в визуализированный контейнер. Лучше использовать несколько JLabels, но они используют один и тот же ImageIcon . ImageIcons можно использовать более одного раза с легкостью:

 public MainFrame() { pieceIcon[0] = new ImageIcon(System.getProperty("user.dir") + "/images/piece1.png"); pieceIcon[1] = new ImageIcon(System.getProperty("user.dir") + "/images/piece2.png"); this.add(boardPanel); displayGUIboard(); } public void displayGUIboard() { boardPanel.add(new JLabel(pieceIcon[0]); boardPanel.add(new JLabel(pieceIcon[0]); } 

Отметим: обратите внимание, что ни одна из ваших переменных не должна быть статичной.

Изменить: относительно вашего недавнего редактирования:

Это работает

 boardLabels[0] = new JLabel(pieces[1]); boardLabels[1] = new JLabel(pieces[1]); 

при использовании ImageIcons, но я хочу избежать этого, так как для обновления платы мне придется удалить, а затем перезагрузить JLabels. Я бы предпочел просто обновить уже загруженные ярлыки ».

Решение
Нет, вам вообще не нужно менять JLabels. Храните свои JLabels там, где они есть, но просто меняйте значки, которые они хранят, используя метод JLabel setIcon(...) .

редактировать
Кроме того, не путайте переменные с объектами. Даже если вы создаете кучу переменных JLabel, если все они относятся к одному и тому же объекту JLabel, вы все равно не можете добавить объект JLabel более одного раза в контейнер.

Редактировать Вы указываете:

Код является частью функции отображения для игры. Массив целых чисел будет представлять плату, которая интерпретируется (но не в приведенном выше коде), и правильные изображения Jlabel будут помещены в панель gridlayout, чтобы отобразить gui платы. Я получил код отображения, чтобы работать нормально, но в моей текущей версии он удаляет jlabels с доски, а затем создает новые JLabels (часть …) … но я бы предпочел, чтобы он обновлялся из целочисленного массива, а не удалял ярлыки, чтение массива, а затем воссоздание ярлыков.

Поэтому создайте JPanel, который использует GridLayout и заполняет его неизменными JLabels. Затем просто измените значки, хранящиеся в JLabels, на основе значений, хранящихся в массиве int. Вы можете создать метод, который упрощает и автоматизирует этот процесс.

Изменить относительно:

edit Я пробовал это раньше, но он выбрасывает исключение нулевого указателя.

Затем разрешите это, как и любой NPE. Узнайте, какая строка выбрасывает NPE, проверьте переменные в строке, по крайней мере один из них равен null, а затем исправьте ее так, чтобы вы инициализировали переменную, прежде чем пытаться ее использовать.

редактировать
например:

 import java.awt.Color; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.image.BufferedImage; import javax.swing.*; @SuppressWarnings("serial") public class GridExample extends JPanel { public static final int[][] MAP = { {1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2}, {1, 1, 0, 0, 2, 2, 2, 2, 2, 2, 2}, {1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2}, {1, 1, 1, 0, 0, 2, 2, 2, 2, 2, 2}, {1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2}, {1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2}, {1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2}, {1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2}, {1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2}, {1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2}, {1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2} }; public static final Color[] COLORS = {}; private JLabel[][] labelGrid = new JLabel[MAP.length][MAP[0].length]; public GridExample() { setLayout(new GridLayout(MAP.length, MAP[0].length)); for (int r = 0; r < labelGrid.length; r++) { for (int c = 0; c < labelGrid[r].length; c++) { labelGrid[r][c] = new JLabel(); labelGrid[r][c].setIcon(Ground.getGround(MAP[r][c]).getIcon()); add(labelGrid[r][c]); } } } private static void createAndShowGui() { GridExample mainPanel = new GridExample(); JFrame frame = new JFrame("GridExample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } enum Ground { DIRT(0, new Color(205,133, 63)), GRASS(1, new Color(0, 107, 60)), WATER(2, new Color(29, 172, 214)); private int value; private Color color; private Icon icon; private Ground(int value, Color color) { this.value = value; this.color = color; icon = createIcon(color); } private Icon createIcon(Color color) { int width = 24; // how to use const in enum? BufferedImage img = new BufferedImage(width, width, BufferedImage.TYPE_INT_ARGB); Graphics g = img.getGraphics(); g.setColor(color); g.fillRect(0, 0, width, width); g.dispose(); return new ImageIcon(img); } public int getValue() { return value; } public Color getColor() { return color; } public Icon getIcon() { return icon; } public static Ground getGround(int value) { for (Ground ground : Ground.values()) { if (ground.getValue() == value) { return ground; } } return null; } } 

Что показывает сетку графического интерфейса:
введите описание изображения здесь

Для сравнения, я переустановил пример @ HFOE, чтобы Ground implements Icon знаменует Ground implements Icon и индексирует массив, возвращаемый values() . Поскольку value представляет собой деталь реализации, int[][] MAP может вместо этого быть Ground[][] MAP .

Обновление: этот вариант показывает Ground[][] MAP и добавляет TexturePaint .

введите описание изображения здесь

 import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.TexturePaint; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.util.Random; import javax.swing.*; /** @see https://stackoverflow.com/a/11556441/230513 */ public class GridExample extends JPanel { public static final Ground[][] MAP = { {Ground.GRASS, Ground.GRASS, Ground.DIRT, Ground.WATER, Ground.WATER}, {Ground.GRASS, Ground.DIRT, Ground.CITY, Ground.WATER, Ground.WATER}, {Ground.GRASS, Ground.DIRT, Ground.CITY, Ground.WATER, Ground.WATER}, {Ground.GRASS, Ground.DIRT, Ground.DIRT, Ground.DIRT, Ground.WATER}, {Ground.GRASS, Ground.GRASS, Ground.DIRT, Ground.WATER, Ground.WATER}, }; private JLabel[][] labelGrid = new JLabel[MAP.length][MAP[0].length]; public GridExample() { setLayout(new GridLayout(MAP.length, MAP[0].length)); for (int r = 0; r < labelGrid.length; r++) { for (int c = 0; c < labelGrid[r].length; c++) { labelGrid[r][c] = new JLabel(); labelGrid[r][c].setIcon(MAP[r][c]); add(labelGrid[r][c]); } } } private static void createAndShowGui() { GridExample mainPanel = new GridExample(); JFrame frame = new JFrame("GridExample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGui(); } }); } } enum Ground implements Icon { DIRT(new Color(205, 133, 63)), GRASS(new Color(0, 107, 60)), WATER(new Color(29, 172, 214)), CITY(Color.lightGray); private static final int SIZE = 42; private Random random = new Random(); private TexturePaint paint; private Ground(Color color) { this.paint = initPaint(color); } private TexturePaint initPaint(Color color) { BufferedImage image = new BufferedImage( SIZE, SIZE, BufferedImage.TYPE_INT_ARGB); Rectangle2D.Double rect = new Rectangle2D.Double(0, 0, SIZE, SIZE); for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { if (random.nextBoolean()) { image.setRGB(col, row, color.getRGB()); } else { if (random.nextBoolean()) { image.setRGB(col, row, color.darker().getRGB()); } else { image.setRGB(col, row, color.brighter().getRGB()); } } } } return new TexturePaint(image, rect); } @Override public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2d = (Graphics2D) g; g2d.setPaint(paint); g.fillRect(0, 0, SIZE, SIZE); } @Override public int getIconWidth() { return SIZE; } @Override public int getIconHeight() { return SIZE; } } 
  • Java Swing revalidate () vs repaint ()
  • Как сделать редактор таблиц JComboBox иметь дизайн обычного JComboBox?
  • Добавьте JLabel с изображением в JList, чтобы показать все изображения
  • Программа не получает доступ к методу paintComponent () расширенного classа JPanel
  • Обновление JLabel каждые X секунд из ArrayList - Java
  • Какова цель использования менеджеров макетов Java?
  • Перемещение JLabel в другой JLabels - GUI
  • Как сделать прямоугольник перемещаться по экрану с помощью привязок клавиш?
  • Обновляйте JLabel несколько раз с результатами многолетней задачи
  • Java KeyListener не регистрирует клавиши со стрелками
  • FocusEvent не получает последнее значение JFormattedTextField, как я могу его получить?
  • Interesting Posts

    Разделить на 10 с помощью сдвигов бит?

    Страница настроек бритвы ServiceStack

    Почему преобразование нормалей с транспонированием обратной матрицы модели?

    Внесение изменений в несколько записей на основе изменения одной записи с помощью SQL

    Программная установка пакетов MSI

    C #: class для декодирования кодировки с кодовым кодированием?

    Photoshop CS4, экспорт новых пресетов документов

    Как узнать, когда обновлены расширения Chrome?

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

    Как добавить значок приложения в проекты телефонных звонков?

    Получение элемента из набора

    ASP.NET перезапускается, когда папка создается, переименовывается или удаляется

    Почему VS не определяет альтернативные токены для логических операторов?

    Закрытие формы во время конструктора

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

    Давайте будем гением компьютера.