2013-07-06 2 views
3

Я следую примерам из Java : The complete reference 8th edition (JDK 7) на AWT, и я не могу показать строку в появившемся окне. Размер и заголовок установлены правильно, и появится окно. Если я выведу строку на консоли в методе paint(), я вижу, что она фактически вызывается несколько раз, но строка не появляется в окне моего приложения. Я не вижу, где я расходился с примером; Я на самом деле есть немного меньше кода (они добавили слушателя мыши и клавиш слушателя): \Java AWT drawString() не отображается в окне

import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class Main { 
    public static void main(String[] args) { 
     Application app = new Application(); 
     app.setSize(new Dimension(640, 480)); 
     app.setTitle("This is a test"); 
     app.setVisible(true); 
    } 
} 

class MyWindowAdapter extends WindowAdapter { 
    public void windowClosing(WindowEvent we) { 
     System.exit(0); 
    } 
} 

class Application extends Frame { 
    public Application() { 
     addWindowListener(new MyWindowAdapter()); 
    } 

    public void paint(Graphics g) { 
     System.out.println("Hey hey !"); 
     g.drawString("Test", 10, 10); 
    } 
} 
+1

@MadProgrammer я не видел SetVisible XD должен вызывать super.paint() – nachokk

+1

@nachokk +1 для 'super.paint()' ... но реальный вопрос - почему AWT? – MadProgrammer

+1

Почему AWT, а не Swing? См. Этот ответ на [Swing extras over AWT] (http://stackoverflow.com/a/6255978/418556) по многим причинам, чтобы отказаться от использования компонентов AWT. Если вам необходимо поддерживать более старые API на основе AWT, см. [Смешивание тяжеловесных и легких компонентов] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html). –

ответ

4

Проблема у вас возникли является тот факт, что вы рисуете прямо на верхней части рамы. Рамка также включает рамку рамки, поэтому позиция 0, 0 (или в вашем случае 10, 10) фактически скрыта под рамкой рамки.

Вы можете увидеть больше об этом here.

Вместо этого, вы должны обратить на Canvas и добавить, что к рамке

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class BadFrame { 

    public static void main(String[] args) { 
     new BadFrame(); 
    } 

    public BadFrame() { 
     Application app = new Application(); 
     app.setSize(new Dimension(640, 480)); 
     app.setTitle("This is a test"); 
     app.setLayout(new BorderLayout()); 
     app.add(new MyCanvas()); 
     app.setVisible(true); 
    } 

    class MyWindowAdapter extends WindowAdapter { 

     public void windowClosing(WindowEvent we) { 
      System.exit(0); 
     } 
    } 

    public class MyCanvas extends Component { 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      System.out.println("Hey hey !"); 
      g.drawString("Test", 10, 10); 
     } 

    } 

    class Application extends Frame { 

     public Application() { 
      addWindowListener(new MyWindowAdapter()); 
     } 

    } 
} 

Следующий вопрос, который приходит на ум, почему AWT? API был мотыльком в пользу Swing. Если ничего другого, он автоматически двойной буферизации;)

ps- Вы также можете найти 2D Graphics некоторый интерес, особенно обсуждение текста

1

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

g.drawString("Test", 10, 200); 

, и вы увидите, что она появится

+0

Да, но почему? Кроме того, разработчикам следует отвлекаться от красок непосредственно на контейнеры верхнего уровня, особенно по той причине, что у ОП возникают проблемы с ... – MadProgrammer

+0

@MadProgrammer: краска в суперклассиках рисует все оконные украшения и т. Д. Тоже afaik, что означает 0,0 не может содержать заголовок. Ваш пример намного приятнее, но для экспериментов с некоторыми материалами из книги я не думаю, что использование paint() напрямую - это большое дело. Я бы предположил, что OP не хочет выпускать его как коммерческий компонент – Neiti01

+0

Не говорите мне, расскажите OP;) – MadProgrammer

Смежные вопросы