Нанесение текста на конверт

Привет ребята!

Мне нужна небольшая помощь в этом, потому что я не могу понять, что я делаю неправильно. Я работаю над программой для написания конвертов. В программе есть 4 JTextField. Имя, город, адрес, почтовый индекс. Я использую keylistener для имени JTextField, чтобы распознать кнопку Enter и добавить новое имя JTextField. (В основном, он устанавливает второе имя JTextField видимым). Таким образом, всего у вас может быть 4 имени JTextField, а остальные (город, адрес, почтовый индекс) всего 7. Также есть кнопка печати j, jtable для просмотра уже написанных конвертов, ожидающих печати и т. Д. Когда я использую g.drawString(), я использую предопределенные значения x, y, которые динамически изменяются в соответствии с длиной текста поля Names, измеренной методом Font Metrics StringWidth() и вычисляемой с правым значением поля... что угодно. Моя основная проблема здесь:

if (name.length() > address.length()) {

            g.drawString(name,
                (250 - nameCord_X) + 46, 214);       //this is working
            g.drawString(city, (250 - nameCord_X) + 46, 226);
            g.drawString(address, (250 - nameCord_X) + 46, 238);
            g.drawString(postal, (250 - nameCord_X + 46, 250);
        } else {
            if (address.length() > name.length()
                && name2.isEmpty())
            { // this is working
                g.drawString(name, (250 - addressCord_X) + 46, 214);
                g.drawString(city, (250 - addressCord_X) + 46, 226);
                g.drawString(address, (250 - addressCord_X) + 46, 238);
                g.drawString(postal, (250 - addressCord_X + 46, 250);

            }
}


                if (name2.length() > name.length()
                    && name2.length() > address.length()
                    && name2.isVisible())
                {// this is working

                    g.drawString(name, (250 - name2Cord_X) + 46, 202);
                    g.drawString(name2, (250 - name2Cord_X) + 46, 214);
                    g.drawString(city, (250 - name2Cord_X) + 46, 226);
                    g.drawString(address, (250 - name2Cord_X) + 46, 238);
                    g.drawString(postal, (250 - name2Cord_X) + 46, 250);

                }
      //This is the part that doesnt working. it prints out 5 lines
      // but the 2nd line is the same as first line,
      // and the real 2nd line value is printed over.
// For example Name: Lion Name2:Lion (altough I typed for
// example horse into name2 field, and the program draw
// the horse string over the 2nd line which contains Lion.)  
//Altough it prints out the all 5 row, it messing only with
//the second row :-/       
                if( (name.length() > name2.length()
                    && name.length() > address.length()
                    && name2.isVisible()))
                {
                    g.drawString(name, (250 - nameCord_X) + 46, 202);
                    g.drawString(name2, (250 - nameCord_X) + 46, 214);
                    g.drawString(city, (250 - nameCord_X) + 46, 226);
                    g.drawString(address, (250 - nameCord_X) + 46, 238);
                    g.drawString(postal, (250 - nameCord_X) + 46, 250);
                   }

person Gabor Beke    schedule 25.07.2013    source источник


Ответы (1)


У вас есть несколько сложных if блоков. Также неясно, какие типы переменных. Кажется, что они String, но, например. вы звоните isVisible() на name2.

Насколько я понимаю, вы используете nameCord_X, addressCord_X, name2Cord_X для выравнивания. Вы хотите, чтобы все строки были выровнены по левому краю, и начните рисовать в той точке, которая позволит правильно разместить самую большую строку, чтобы она не превышала правую сторону вашего конверта. Это правильно?

Если да, то предлагаю сначала найти максимальную из вышеперечисленных длин. Вы должны принимать во внимание каждый из них, только если он имеет значимое значение. Затем вы можете сделать следующее:

int max = ... // maximum of the above values - only not empty values should be taken into account
int dy = 12;  // it seems you always leave 12 pixels between the lines
int y = ...;  // the value with the topmost y. It seems you use 202 when both names are present 214 when name2 is not given
int x = 250 - max + 46;

String[] labels = new String[] {name, name2, city, address, postal};
for (String label : labels) {
    if (label == null || label.length() == 0) {
        continue; // ignore null or empty values
    }
    g.drawString(name, x, y);
    y += dy;
}    

Я надеюсь, что это помогает

person c.s.    schedule 25.07.2013
comment
Спасибо за ваш ответ. Я попробую это сейчас. Да, вы все правильно видите, извините за отсутствие информации. Я отпишусь здесь после того, как опробую вашу идею :) - person Gabor Beke; 25.07.2013