2013-04-08 3 views
2

Я пытаюсь нарисовать один овал над другим овалом. Здесь я использую оператор select для рисования в компоненте компонента краски.Окрашивание объектов друг на друга

import java.awt.*; 

public class test extends JPanel{ 

public static final int OVAL = 1; 
public static final int SOLID = 2; 

private int type = LINE; 

public test(int type){ 

    this.type = type; 
} 
public void piantComponent(Graphics g){ 
    super.paintComponent(g); 

    switch(type) 
    { 
     case OVAL: 
     g.setColor(Color.YELLOW); 
     g.drawOval(0,0,150,150); 
     break; 

     case SOLID: 
     g.setColor(Color.BLUE); 
     g.fillOval(0,0,50,50); 
     break; 

    } 
} 


} 

Теперь в моем основном методе я хочу, чтобы отобразить твердый синий овал (SOLID) внутри желтого овала (овал).

import...; 
    public class Main{ 
     public static void main (String [] args){ 
      JFrame window = new JFrame(); 
      window.add(new test(test.OVAL)); 
      window.add(new test(test.SOLID)); 
      window.setSize(300,300); 
      window.setVisible(true); 

     } 

    } 

Это не делает то, что я хочу, чтобы он вообще делал. Это отображает только овальное, а не овальное и твердое. Я думаю, что я перегружаю окно, чтобы отображать только овал. Я попытался отобразить с менеджером компоновки (gridlayout), но это не отображает две картины друг над другом, она отображает две картины рядом друг с другом.

Как исправить это, не теряя оператора switch.

+0

Используйте правильные имена классов Java. «test» не является стандартным именем. Имена классов начинаются с символа верхнего регистра. – camickr

ответ

1
window.add(new test(test.OVAL)); 
window.add(new test(test.SOLID)); 

Ваша проблема имеет отношение к ZOrder. Для упрощения Swing окрашивает компоненты в обратном порядке, они находятся на панели. Таким образом, в вашем случае SOLID окрашивается до OVAL. Поскольку размер OVAL больше по размеру, он покрывает SOLID.

Вы можете заставить Свинг красить компоненты в более интуитивным порядке, выполнив:

window.add(0, new test(test.OVAL)); 
window.add(0, new test(test.SOLID)); 

Теперь последний компонент, добавленный также будет окрашен в последнюю очередь.

Однако лучший дизайн заключается в создании отдельных классов Овальный и сплошной, чтобы вы могли независимо определять размер, местоположение и цвет. Затем вы можете добавить столько компонентов на панель, сколько захотите.

0

Почему вы не просто рисуете один за другим? Как что:

g.setColor(Color.YELLOW); 
    g.drawOval(0,0,150,150); 
    g.setColor(Color.BLUE); 
    g.fillOval(0,0,50,50); 
+1

Но если я не хочу потерять инструкцию Switch? Я могу рисовать с помощью оператора switch, но он отображает только одну из картин, а не их обоих. Это означает, что один будет переопределять другой. Если я использую диспетчер компоновки, он отображается рядом друг с другом, а не поверх одного другого. – Jonathan

0

Попробуйте что-то вроде этого (только с помощью расширенного описания):

private ArrayList<int> ovals = new ArrayList<int>(); 


public test(int type) { 
     ovals.add(type); 
} 



public void piantComponent(Graphics g) 
{ 
     super.paintComponent(g); 

     for(int oval : ovals) 
     { 
      switch(type) 
      { 
       case OVAL: 
       g.setColor(Color.YELLOW); 
       g.drawOval(0,0,150,150); 
       break; 

       case SOLID: 
       g.setColor(Color.BLUE); 
       g.fillOval(0,0,50,50); 
       break; 
      } 
     } 
} 

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

1
  • Painting in Swing должно быть сделано для бетона JComponent

  • public class test{ (используйте правильное соглашение об именах и изменить test к Text) не содержит каких-либо использование JComponents

  • JPanel или просто JComponent

  • живопись в AWT, Sw ING по умолчанию никогда не возвращается PreferredSize, то контейнер имеет нулевую Dimension, required to override getPreferredSize

+0

учтите, что это не моя настоящая программа! – Jonathan

+0

super.paintComponent (g); очистка всей предыдущей картины – mKorbel

1
  1. модификация в классе испытаний.читать комментарии для объяснения изменений

импорт java.awt. *;

тест общественного класса расширяет JPanel {

public static final int OVAL = 1; 
    public static final int SOLID = 2; 
    **public static final int BOTH = 3;** //instance variable to represent the 
             //painting of both images 

    private static int type; 

    public test(int type){ 
    this.type = type; 
    } 

    public void paintComponent(Graphics g){ 

    switch(type) 
    { 
     case OVAL: 
      g.setColor(Color.BLACK); 
      g.drawOval(0,0,150,150); 
      break; 

     case SOLID: 
      g.setColor(Color.BLUE); 
      g.fillOval(0,0,50,50); 
      break; 

     case BOTH:      //statements to draw both figures 
      g.setColor(Color.BLACK); 
      g.drawOval(0,0,150,150); 
      g.setColor(Color.BLUE); 
      g.fillOval(0,0,50,50); 
      break; 

    } 
    }//paint component 

}

  1. в основном использованием метода

    window.add (новый тест (test.BOTH);