2015-05-05 2 views
0

EDIT: для уточнения, одним из моих требований является использование одного массива.Единый массив для хранения нескольких переменных в каждом элементе

У меня возникли проблемы с хранением нескольких переменных в одном элементе массива. Мы создаем действительно простую программу для имитации Microsoft Paint. Одним из требований является сохранение каждого элемента, который я втягиваю в массив, так что метод «paint» реплицирует чертежи каждый раз, когда окна сводятся к минимуму, а затем повторно отображаются. Ниже приведены требования

Мы предполагаем, чтобы максимальный размер для массива 20. Каждый элемент должен включать в себя переменные: 5

  • обугленного форму (L для линии, R для прямоугольника, с для окружности)
  • Старта х значения
  • Старт у значения
  • ширина (прямоугольник), или окончание х (строка), или радиус (круг)
  • высоты (прямоугольник), или окончание у (линии), или радиус (круг)

Вот мой код для класса массива:

class storeDraws { 
    final int MAXSIZE = 20; 
    static int S[]; 
    static int n; //number of draws user makes 
    static char shape; 
    static double px, py, w, h; 

    storeDraws() { 
     S = new int [MAXSIZE]; 
     n = 0; 
     shape = 'l'; 
     px = 0; 
     py = 0; 
     w = 0; 
     h = 0; 
    } 
} 

Я прочитал несколько мест, которые я могу ввести массив как (с помощью mouseReleased (MouseEvent е) метод:

storeDraws[] input = new storeDraws{value, value, value, value, value}; 

Но я не думаю, что это сработало бы для того, что я пытаюсь сделать с помощью метода «paint», чтобы перерисовывать фигуры. Я думал, что могу как-то передать его, используя стандартный формат S [n] = (char, double, double, double, double), но я предупреждаю, что это незаконно.

Редактировать 8:30 am Я получил эту часть работы. В моем классе вот мой код сейчас.

class storeDraws { 
    static char shape; 
    static int px, py, w, h; 

    storeDraws() { 
     shape = 'l'; 
     px = 0; 
     py = 0; 
     w = 0; 
     h = 0; 
    } 
} 

Затем я заявил об этом в классе DrawPanel:

private storeDraws[] store = new storeDraws[20]; 
private int n = 0; 

И mouseReleased метод DrawPanel:

public void mouseReleased(MouseEvent e) { 
    if (drawShape == "line") { 
     store[n].shape = 'l'; 
     store[n].px = p1.x; 
     store[n].py = p1.y; 
     store[n].w = p3.x; 
     store[n].h = p3.y; 
     n++; 
    } 

И краски:

public void paint(Graphics g) { 
    for (int i = 0; i < n; i++) { 
     if (store[i].shape == 'l') 
      g.drawLine(store[n].px, store[n].py, store[n].w, store[n].h); 

Но если я рисую 6 строк он только перерисовывает las t линии.

+0

В массиве хранятся только аналогичные элементы, поэтому с '(char, double, double, ...)' вы получаете ошибку. Вы уверены, что вам нужен массив? Вы можете использовать список или карту. – hamena314

+0

Вам нужно переосмыслить, как вы представляете фигуры. Создайте класс 'Shape', затем создайте массив этого класса' Shape [] '. Как и сейчас, ваш класс 'storeDraws' пытается сделать то и другое. – kuporific

+0

@ hamena314 Требование моего назначения - использовать массив ... –

ответ

1

Я думаю, вам нужно отделить некоторые функциональность, которую вы хотите. Вы можете иметь класс для каждого из элементов, а затем хранить экземпляры класса в массиве объектов DrawingElement.

Так что вы могли бы сделать что-то вроде этого:

DrawingElement[] drawing = new DrawingElement[20]; 
DrawingElement circle = new DrawingElement('c', 10, 10, 10, 10); 
DrawingElement rect = new DrawingElement('r', 20, 10, 10, 10); 
drawing[0] = circle; 
drawing[1] = rect; 

Примечание: Если вам нужно, чтобы иметь возможность получить количество объектов в массиве (переменная n в коде), вы можете использовать некоторые реализация Связанный список (который имеет метод size()) и сделать некоторые проверки при добавлении элементов, чтобы убедиться, что вы не добавите мимо макс 20.

Пример с LinkedList:

LinkedList<DrawingElement> drawing = new LinkedList<DrawingElement>(); 
DrawingElement circle = new DrawingElement('c', 10, 10, 10, 10); 
DrawingElement rect = new DrawingElement('r', 20, 10, 10, 10); 
drawing.add(circle); 
drawing.add(rect); 
int n = drawing.size(); //will be 2 

Розыгрыш Элемент Класс:

public class DrawingElement 
{ 
    char shape; 
    double px, py, w, h; 

    public DrawingElement(char shape, double px, double py, double w, double h) 
    { 
     this.shape = shape; 
     this.px = px; 
     this.py = py; 
     this.w = w; 
     this.h = h; 
    } 

    //Add getters and setters (accessors and mutators) for class variables 
} 
+0

@ChrisCampbell, @ Avantol13 Примечание: 'shape',' px' и т. Д. Не должны быть 'static', так как это означает, что есть одно значение для ** all * * Экземпляры «DrawingElement». – kuporific

+0

@kuporific отредактирован. Скопируйте и вставьте и не просмотрите его достаточно хорошо:/thanks – Avantol13

+0

@kuporific Спасибо, ребята, это очень помогло. Теперь мне просто нужно выяснить, как их перерисовать, используя метод «public void paint (Graphics g)». Есть предположения? –

0

Я думаю, вы должны использовать коллекцию для этой цели. Создайте массив, сохраните значения , затем добавьте каждый объект массива в коллекцию (список).

0

Первая точка. Мы не можем хранить разные типы переменных в массиве.

Массив - это контейнерный объект, который содержит фиксированное число значений одного типа. Здесь вы пытаетесь сохранить несколько типов переменных в целочисленный массив.

смотрите по этой ссылке:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

Чтобы преодолеть этот недостаток, мы имеем Collection API введенный с JDK1.5

См ссылки:

http://docs.oracle.com/javase/tutorial/collections/index.html

0

вы можете вместо массива используйте arraylist. это поможет вам сохранить различную переменную. Если есть необходимость использовать только массив, который вы можете использовать массив объектов образец кода объект а [] = { «а», 10,10.2,10.3,10.4,10.5}

0

Пожалуйста, обратитесь

В вашем случае было бы лучше использовать Java Collection (ArrayList), а не массив.

+1

Одним из требований является использование одного массива, а не arraylist. –

+0

@ChrisCampbell Я отправил еще один ответ с кодом cnippet, пожалуйста, обратитесь к этому, если вы хотите придерживаться этого требования. –