2013-11-12 3 views
1

У меня возникли проблемы с компоновкой компонентов из созданного ArrayList. Если я обернусь с ним, я могу либо получить первый элемент, либо второй элемент, и если мне повезет, то и не появиться!Устранение неисправностей с помощью ArrayList

import java.awt.*; 
import java.awt.geom.*; 
import java.util.*; 
import javax.swing.*; 

public class FaceShortCode { 
ArrayList<CreateCircles> faceCircles = new ArrayList<CreateCircles>(); 

public FaceShortCode() { 
    JFrame main = new JFrame(); 
    main.setTitle("Face Frame"); 
    main.setSize(new Dimension(600, 600)); 
    main.setLocationRelativeTo(null); 
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.setVisible(true); 

    Container c = main.getContentPane(); 
    // c.setLayout(null); 

    faceCircles.add(0, new CreateCircles(100, 50, 400, 350, Color.red)); 
    faceCircles.add(1, new CreateCircles(200, 100, 65, 65, Color.black)); 
    c.add(faceCircles.get(0)); 
    c.add(faceCircles.get(1)); 

} 

class CreateCircles extends JComponent { 
    double x, y, width, height; 
    Color myColor; 

    public CreateCircles(double x, double y, double width, double height, 
      Color myColor) { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
     this.myColor = myColor; 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     Ellipse2D circle = new Ellipse2D.Double(x, y, width, height); 
     g2.setColor(myColor); 
     g2.fill(circle); 

    } 
} 

static class Run { 
    public static void main(String[] args) { 
     new FaceShortCode(); 
    } 
} 

}

Я попытался бросить в main.repaint() после каждого добавления к контейнеру с, попробовал перекрасить() в моем методе живописи, но ничего, кажется, работает. Есть ли еще что-нибудь, чтобы перекрасить(), что я просто отсутствую?

+0

Менеджер компоновки не знает, куда помещать компоненты, которые добавлены в контейнер. Является ли только последний компонент, добавленный последним? Это потому, что последнее добавление заменило предыдущий. Решите, как вы хотите, чтобы макет выглядел, и выбрал менеджер макетов, который даст вам то, что вы ищете. – NormR

ответ

0

Перед тем, как выполнить логику, вы должны поместить всю свою логику перед вами setVisible(), иначе ваш кадр станет видимым.

public FaceShortCode() { 

    Container c = main.getContentPane(); 
    // c.setLayout(null); 

    faceCircles.add(0, new CreateCircles(100, 50, 400, 350, Color.red)); 
    faceCircles.add(1, new CreateCircles(200, 100, 65, 65, Color.black)); 
    c.add(faceCircles.get(0)); 
    c.add(faceCircles.get(1)); 

    JFrame main = new JFrame(); 

    main.setTitle("Face Frame"); 
    main.setSize(new Dimension(600, 600)); 
    main.setLocationRelativeTo(null); 
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.setVisible(true); 
} 

Рассматривают делает FaceShortCode расширяет JFrame.

public class FaceShortCode extends JFrame { 
    private ArrayList<CreateCircles> faceCircles = new ArrayList<CreateCircles>(); 

    public FaceShortCode { 
     setLayout(new Girdlayout(1, 2)); 

     faceCircles.add(0, new CreateCircles(100, 50, 400, 350, Color.red)); 
     faceCircles.add(1, new CreateCircles(200, 100, 65, 65, Color.black)); 

     add(faceCircles.get(0)); 
     add(faceCircles.get(1)) 

     setTitle("Face Frame"); 
     setSize(new Dimension(600, 600)); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 
} 
+0

'Рассмотрение вопроса о создании FaceShortCode расширяет JFrame. Это лучше »- нет, это не так. Нет необходимости расширять JFrame, так как вы не изменили никаких свойств фрейма. Посмотрите примеры в учебнике Swing. – camickr

0

Ваш дизайн немного запутанный. Нет необходимости в ArrayList. Когда вы используете компоненты, вы можете просто добавить компоненты непосредственно на панель. Обычно вы используете ArrayList только в том случае, если вы выполняете обычную роспись, рисуя объекты, которые не являются компонентами, например, когда вы хотите нарисовать фигуру. Для примера этого подхода взгляните на Custom Painting Approaches.

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

Так что вам нужно изменить, как вы рисуете свой пользовательский компонент. Все окрашивание должно выполняться в месте (0, 0) вашего компонента. Затем вы должны установить местоположение компонента как значение x/y. Это означает, что компонент будет окрашен в положение x/y относительно панели, к которой вы добавляете компонент. Затем вам нужно установить размер вашего компонента, который будет шириной/высотой.

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