2015-08-29 10 views
0

Я программировал небольшую полезность, и все шло хорошо, но затем я попытался добавить несколько ярлыков. Они появились. Затем я сделал их дольше, и они исчезли. Я пробовал много экспериментов (перепозиционирование, изменение шрифта, изменение порядка), но ничего не было последовательным, кроме того, что более длинные строки были проблематичными. Думая, что я неправильно использовал Swing, я попытался упростить, вернувшись к AWT, но вижу почти одинаковые проблемы. Я даже прошел через код с помощью jdb, и, опять же, иногда g.drawString работает на более длинных строках, а в других случаях - нет. Я пытался поймать любые ошибки и ничего не видел.Java graphics.drawString непоследовательно отображается на кадре с использованием AWT

Очевидно, что у меня нет чего-то фундаментального. Может ли кто-нибудь объяснить: 1) почему короткие строки (например, «ярлык») кажутся всегда работающими? 2) почему более длинные строки иногда не отображаются вообще? 3) являются сбоями из-за того, что жало не отображается вообще или они переписываются каким-либо другим изображением? 4) если # 3 «перезаписано», как можно управлять порядком этих других (неизвестных) изображений?

Я раздели код. Я компиляция с JAVAC 1.7.0_79

import java.awt.*; 

public class GraphicsQuestion extends Frame { 
    public GraphicsQuestion() 
    { 
     super("Question"); //call to Frame 
     setFocusable(true); 
    } 
    public void DrawLabels(Graphics g) 
    { 
     g.setFont(new Font("Courier", Font.PLAIN, 16)); 
     g.setColor(Color.BLACK); 

     g.drawString("label", 0, 100); 
     String ss = new String("label123456789"); 
     g.drawString(ss, 100, 150); 

     g.drawString("label12345", 100, 170); //does not print 
     g.drawString("label1", 10, 170); 

    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     DrawLabels(g); 
    } 
    public static void main(String args[]) { 
     GraphicsQuestion gq = new GraphicsQuestion(); 
     gq.setBackground(Color.WHITE); 
     gq.setSize(800, 200); 
     gq.setVisible(true); 
    } 
} 

Как комментарий в коде предполагает, выход отсутствует один из ярлыков. Время от времени отсутствуют обе более длинные метки. И если я прокомментирую печать «label12345», то при первом запуске я пропускаю ярлык «label123456789». И если я сделаю строку «label12345» короче, например «label123» , все напечатано.

Я привык к постоянному поведению в своем программировании. Если мне трудно понять, что происходит с этим простым примером, я не решаюсь строить что-либо более сложное. Может ли кто-нибудь объяснить непоследовательное поведение?

**** оригинальный вопрос выше, что следует, на основе полученных ответов ****

Благодаря VGR для быстрого реагирования. Я пытался не «смешивать Swing с AWT», но я пробовал код. Казалось, это улучшило ситуацию. К сожалению, я перешел на следующий уровень и добавил функциональность KeyListener, и снова вижу неустойчивости.

Теперь я задаюсь вопросом, есть ли у меня что-то более глубокое, чем ошибка Java. Возможно, у меня есть неисправность аппаратного или графического драйвера, потому что шрифт может быть искажен. Я могу скомпилировать код, и он будет пропускать метки 20 из 20 раз, а затем перекомпоновать тот же код таким же образом и получить этот искаженный вывод.

http://www.screencast.com/t/rsBjRZlXlWu

я включу свой новый код ниже, но это выглядит все менее и менее как вопрос программирования Java и больше как вопрос окружающей среды. Я бегу Ubuntu 14.04.3 LTS на E7450 Dell

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.SwingUtilities; 

class GraphicsAnswer extends Frame implements KeyListener { 
    public GraphicsAnswer() 
    { 
     super("Question2"); //call to Frame 
     addKeyListener(this); 
     setFocusable(true); 
    } 
    public void DrawLabels(Graphics g) 
    { 
     g.setFont(new Font("Courier", Font.PLAIN, 16)); 
     g.setColor(Color.BLACK); 

     g.drawString("label", 0, 100); 
     String ss = new String("label123456789"); 
     g.drawString(ss, 100, 150);   //sometimes distorted 

     g.drawString("label123456", 100, 170); //sometimes distorted 
     g.drawString("label1", 10, 170); 

    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     DrawLabels(g); 
    } 
    public void keyPressed(KeyEvent e) 
    { 
     int keyCode = e.getKeyCode(); 
     if (e.getKeyChar() == 'X') 
     System.exit(0); 
     else 
     update(e.getKeyChar()); 
    } 
    public void keyReleased(KeyEvent e) 
    { 
    } 
    public void keyTyped(KeyEvent e) 
    { 
    } 
    public void update(char c) 
    { 
     Graphics g = this.getGraphics(); 
     g.drawString("done", 10, 10); 
    } 
} 

public class QMain2 implements Runnable { 
    public void run() { 
     // Invoked on the event dispatching thread 
     // Construct and show GUI 
     GraphicsAnswer ga = new GraphicsAnswer(); 
     ga.setBackground(Color.WHITE); 
     ga.setSize(800, 200); 
     ga.setVisible(true); 
    } 
    public static void main(String [] args) { 
     SwingUtilities.invokeLater(new QMain2()); 
    } 
} 

Кто-нибудь знает шрифта тестового драйвера пакета для Java, так что я могу проверить мое окружение?

+0

Качающиеся операции должны выполняться в потоке отправки событий AWT. Выполнение их в другом месте вызывает непредсказуемое поведение. Это описано в документации [javax.swing package] (https://docs.oracle.com/javase/8/docs/api/javax/swing/package-summary.html#package.description). Короче: поместите тело вашего метода 'main' внутри вызова [EventQueue.invokeLater] (https://docs.oracle.com/javase/8/docs/api/java/awt/EventQueue.html#invokeLater- java.lang.Runnable-). – VGR

+0

Спасибо VGR. Теперь это, безусловно, кажется более стабильным. Я читаю (и перечитываю) ссылки, на которые вы указали мне. Я ожидаю, что он будет тонуть в большей степени, пока я продолжаю программировать. Я ценю быструю помощь. – JayWH

+0

Я обновил вопрос с кодом, предложенным VGR. К сожалению, он обнаружил больше нестабильности, поскольку я добавляю сложность. Возможно, это не проблема Java-кодирования, а проблема Java/Linux/graphics. – JayWH

ответ

0

Я ввел, протестировал и скомпилировал точный код сверху без изменений, и все, кажется, появляется без ошибок очень последовательно. Все четыре строки были отображены 20/20 тестовых прогонов, которые я сделал на нем.

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

Отмеченные screenshot моих результатов на всех 20 тестовых компиляциях. Удачи!

+0

Спасибо m_callens за отзыв. Меня не удивляет, что этот код будет работать для некоторых людей, возможно, даже в любое время. Я, конечно, ожидал, что он все время будет работать на меня. Но для меня это непоследовательно. Я обновил вопрос с улучшенным кодом из VGR, который теперь кажется последовательным. Теперь я переношу это на компоненты JFrame и Swing и посмотрю, есть ли у меня регрессии. – JayWH