Java и ее переменные (со многими s-овами) на Swing - PullRequest
0 голосов
/ 15 августа 2011

Я собираюсь поделиться здесь интересным случаем о программировании java и его переменных .

Первое, что я хотел сказать, это то, что мыв этих ситуациях:

  1. У нас много JLabels с соглашениями об именах (* jll_txtNormalCnn *).
  2. ' nn ' буквально означает координату (x, y) .Чтобы быть точным, это цифра (0-9).
  3. Снимок экрана много переменных, используемых здесь .

На снимке экрана;Мы можем видеть, есть 5 х 3 таблицы.И каждый столбец состоит из каждого JLabel, размещенного над ним.Так что это , имитирующая доску с текстом на ней.

Мой очень простой вопрос, а не об интерфейсе;речь идет о стиле программирования. Что если .... Переменные sooOOO много .Допустим, есть 100 переменных, использующих такие соглашения об именах.И как только мы хотим setText () для каждой из переменных, мы хотим упростить кодирование - вместо того, чтобы вводить его по одному ... мы хотели использовать зацикливание для доступа к каждой переменной .... Но я понял, что это невозможно.

Код ниже не будет работать вообще;

for (int x=00; x<101; x++){
(jll_txtNormalC+x).setText("Something");
}

Isесть ли способ решить этот вопрос?Я не уверен, что это тема динамических переменных или что-то в этом роде, потому что я никогда не слышал об этом в Java, кроме « Generics », да, я слышал.

Ответы [ 8 ]

6 голосов
/ 15 августа 2011

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

Возможно, лучшей идеей будет инкапсулировать эту информацию в другом объекте и позволить ему поддерживать сетку меток. Это намного лучше, чем ваш вариант венгерской нотации.

4 голосов
/ 15 августа 2011

Проще говоря: не используйте отдельно названные переменные для этого.Используйте какую-нибудь коллекцию, будь то массив (возможно, JLabel[][]), карта или что-то еще подходящее.

1 голос
/ 15 августа 2011

1) если ваше требование (требования) строго квадратично, и есть JLabels или JTextFields (с его вложенными / наследуемыми методами Swing и его производными, включая картинки ),

2) если вам потребовались периодические изменения для Component's содержимого

3), если вы хотите избежать утечек памяти, производительности или зависания графического процессора

4), еслиВы хотите просто и легко получить / установить данные или изменения

, затем поместить их в JTable , по умолчанию в ячейке содержится JLabel, по умолчанию в ячейке JTextField в CellEdit(Мышь или ввод с клавиатуры)

1) тогда вы можете забыть об именах, possitionig и другом ZOO, все три области из MVC и JTable будут по-прежнему согласованы

2) выможно получить доступ к данным только из видимых / отфильтрованных / отсортированных / удаленных / обработанных TableView

3) вы можете получить доступ ко всем данным из TableModel

4) плюс ко всем JTable's функциямкоторые были добавлены / получены с Java6

5) сэкономить много времени для LayoutManager , возможность просмотра на экране, Слушатели , доступ к бетону Component

1 голос
/ 15 августа 2011

Обычно при работе с сетками или матрицами вы используете 2d-массивы.

Храните ваши JLabels в 2d-массиве.Вы можете перебирать их или обращаться к меткам по координатам сетки (x, y), используя обозначение [x][y], которое легко читается.

JLabel[][] labelArray = new JLabel[numRows][numCols];
for(int i = 0 ; i < labelArray.length; i++) {
    for(int j = 0; j < labelArray[i].length; j++) {
        labelArray[i][j].setText("Something");        
    }
}
0 голосов
/ 15 августа 2011

Правильный ответ - несколько раз упомянутый двумерный массив.

но, если ваши метки должны оставаться единственными переменными, вы также можете решить это с помощью отражения:

    for (int x=00; x<101; x++){
    Field f = getClass().getDeclaredField("jll_txtNormalC" + x);
    JLabel l = (JLabel)f.get(this);
    l.setText("Something");
}
0 голосов
/ 15 августа 2011

OTOH идея: создать ArrayList или массив и заполнить его Jlabels. Выполните итерацию по коллекции и вызовите setText для каждого.

0 голосов
/ 15 августа 2011

Вам нужно использовать какой-то компонент контейнера пользовательского интерфейса (что-то вроде сетки) или, может быть, просто массив.

0 голосов
/ 15 августа 2011

хранит jlabels в массиве (5x3 или 10x10).

...