рисование коробок в Java - PullRequest
2 голосов
/ 15 мая 2011

Я написал программу, которая имитирует распределение памяти с помощью алгоритмов первого и наилучшего соответствия.

Теперь я хочу связать мою программу с чертежом набора блоков, представляющих доступные сегменты памяти

Перед выделением

enter image description here

После размещения enter image description here

Так что он просто перерисовывает, но изменяет размер одного поля и раскрашивает его ... Какой самый простой способ сделать это? У меня есть набор блоков разных размеров, которые будут отображаться динамически в соответствии с вводом, когда пользователь выполняет какое-либо действие, размер одного из блоков будет изменен, он будет перекрашен и т. Д.

Ответы [ 4 ]

3 голосов
/ 15 мая 2011

Я думаю, что к этому лучше всего подходить с использованием графики.

  1. Создание BufferedImage размера, подходящего для всех блоков.
  2. Получите экземпляр Graphics, вызвав любой изgetGraphics() или createGraphics().
  3. Для каждого блока памяти:
    1. Вызовите Graphics.setColor(Color) в соответствии со статусом выделения, затем ..
    2. Graphics.fillRect(int,int,int,int) или fillPolygon(Polygon)нарисовать блок памяти.
  4. При необходимости используйте AffineTransform для масштабирования размеров.Для этого потребовался бы объект Graphics2D.
2 голосов
/ 15 мая 2011

Используйте JPanel, добавьте JLabels, например, 0verbose, но, на мой взгляд, раскладка должна быть BoxLayout или GridBagLayout .

При использовании FlowLayout вам необходимо убедиться, что размер контейнера имеет правильную ширину, чтобы разместить один компонент под другим, так как по умолчанию он размещает компоненты в ряду.

Из учебника по Java о FlowLayout"Класс FlowLayout помещает компоненты в строку, размер которой соответствует их предпочтительному размеру. Если горизонтальное пространство в контейнере слишком мало, чтобы поместить все компоненты в одну строку, Класс FlowLayout использует несколько строк. "

2 голосов
/ 15 мая 2011

Используйте JPanel в качестве контейнера с вертикальным FlowLayout BoxLayout и добавьте в него JLabel для каждого блока памяти.

1 голос
/ 16 мая 2011

Если блоки памяти могут быть отрисованы одинакового размера, JComponent (или даже проще JProgressBar) может использоваться для представления каждого блока памяти. Затем они могут быть помещены в GridLayout или BoxLayout для организации размещения. Е.Г.

MemoryAllocation.java

import java.awt.*;
import javax.swing.*;
import java.util.Random;

class MemoryAllocation {

    public static JProgressBar getMemoryBlock(int full) {
        JProgressBar progressBar = new JProgressBar(
            SwingConstants.VERTICAL, 0, 100);
        progressBar.setValue(full);
        progressBar.setPreferredSize(new Dimension(30,20));
        return progressBar;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JPanel memoryView = new JPanel(new GridLayout(0,10,1,1));

                Random random = new Random();
                for (int ii=0; ii<200; ii++) {
                    int amount = 100;
                    if (random.nextInt(5)==4) {
                        amount = 100-random.nextInt(75);
                    }
                    memoryView.add( getMemoryBlock(amount) );
                }

                JOptionPane.showMessageDialog(null, memoryView);
            }
        });
    }
}

Снимок экрана

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...