2015-05-11 2 views
2

Почему это меняет цвет фона для java.awt.Canvas, меняет фон для всего кадра?Java AWT: настройка фона Canvas меняет фон для всего кадра

Я создал объект кадра следующим образом:

public class Gui extends Frame { 

    public Gui() { 

     setSize(800, 600); 
     setLocation(0, 0); 

     Canvas cd=new Canvas(); 
     cd.setSize(500, 300); 
     cd.setBackground(Color.BLUE); 
     add(cd); 


     addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent arg0) { 
       System.exit(0); 
      } 

     }); 
    } 

    @Override 
    public void paint(Graphics g) { 
     paintComponents(g); 
    } 

    public static void main(String[] args) { 

     Gui g=new Gui(); 
     g.setVisible(true); 

    } 

} 

Приведенный выше код устанавливает размер кадра, чтобы быть 800х600, а затем добавляет значительно меньший холст к нему - 500x300, и, наконец, устанавливает цвет фона, чтобы быть Color.BLUE, но вместо того, чтобы получить 500x300 синий прямоугольник внутри большей, 800х600 оконной рамы (с серым цветом по умолчанию), то результат будет 800х600 кадра с синим фоном:

enter image description here

Документы говорят:

общественного недействительный setBackground (цвет с)

Устанавливает цвет фона этого компонента.

Цвет фона влияет на каждый компонент по-разному, а части компонента, на который влияет фоновый цвет, могут различаться между операционными системами .

Может быть, проблема (я запускаю это на Ubuntu)?
Или я пропустил что-то еще здесь?

+0

Не ждите, чтобы получить помощь на depricated вещи, они даже не учат их в колледже больше. – Mordechai

+0

Зачем использовать AWT? См. [Этот ответ] (http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) по многим причинам, чтобы отказаться от использования AWT с использованием компонентов в пользу Swing. –

+0

Я использую AWT, потому что мне нужно использовать JFreeChart (http://www.jfree.org/jfreechart/api/javadoc/), который поддерживает только компоненты AWT, насколько я знаю ... –

ответ

1

расположение по умолчанию в Frame является BorderLayout (хотя много кода примера с использованием на основе AWT Frame класса был написано в то время, когда раскладка по умолчанию было FlowLayout). Без ограничений компоновки компонент, добавленный в BorderLayout, окажется в CENTER, который растягивает компонент так, чтобы он соответствовал доступной высоте и ширине.

Вместо этого мы можем использовать GridBagLayout. Когда мы добавим один компонент к GridBagLayout без каких-либо ограничений, он будет центрирован и размер будет соблюден. НАПРИМЕР. (См дополнительные комментарии в коде.)

Centered Canvas in Frame

import java.awt.*; 
import java.awt.event.*; 

public class Gui extends Frame { 

    public Gui() { 
     setSize(400, 200); 
     setLocationByPlatform(true); 
     setLayout(new GridBagLayout()); 

     Canvas cd=new Canvas(); 
     // TODO: Override rather than set & make it preferred rather than actual 
     cd.setSize(300, 100); 
     cd.setBackground(Color.BLUE); 
     add(cd); 

     addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent arg0) { 
       System.exit(0); 
      } 
     }); 
    } 

    @Override 
    public void paint(Graphics g) { 
     //paintComponents(g); // wrong method! 
     super.paint(g); // right method, but does nothing different to original! 
    } 

    public static void main(String[] args) { 
     // TODO: AWT/Swing based GUIs should be started on the EDT 
     Gui g=new Gui(); 
     g.setVisible(true); 
    } 
} 
+0

Что такое «AWT/Swing» GUI следует запускать на EDT "? Вы имеете в виду, что он должен работать на отдельной теме? –

+1

См. [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) и особенно ** [Начальные темы] (http://docs.oracle.com/javase/tutorial/ uiswing/concurrency/initial.html) ** для более подробной информации. –