Компонент не виден в JPanel - PullRequest
1 голос
/ 24 июля 2011

У меня есть JPanel в контейнере JFrame под названием Box

public Box(){
        add(new Ball());
    }

    public void paint(Graphics g){
        g.setColor(Color.WHITE);
        g.fillRect(OFFSET, OFFSET, WIDTH, HEIGHT);
        g.setColor(Color.BLACK);
        g.drawRect(OFFSET, OFFSET, WIDTH, HEIGHT);
    }

Шарик расширяет Компонент и рисует шар

public class Ball extends Component{
   ...
public void paint(Graphics g){
    g.setColor(Color.BLACK);
    g.fillOval(xCoord, yCoord, radius, radius);
}
   ...
}

Когда я добавляю Коробку с Шариком в контейнерЯ могу только увидеть коробку.Если я просто добавлю шарик, то смогу увидеть шарик.

Кто-нибудь знает, почему шарик не виден при добавлении в коробку?

Ответы [ 4 ]

4 голосов
/ 24 июля 2011

В дополнение к переопределению paintComponent, используйте LayoutManager для автоматической установки границ. В целях тестирования вы можете установить для LayoutManager экземпляра Box значение null и использовать setBounds для экземпляра Ball.

3 голосов
/ 24 июля 2011
  1. Не смешивайте тяжелые и легкие компоненты. Вместо этого вы должны расширить JComponent.
  2. Вы должны переопределить paintComponent(), а не paint().
  3. Имеет ли Ball размер? Если вы не предоставили Ball Dimension, он не будет виден.
2 голосов
/ 24 июля 2011

В Swing обычно не следует переопределять метод paint.Вместо этого используйте paintComponent.

1 голос
/ 24 июля 2011

возможны три ошибки

1 / простейшая краска с использованием JLabel

2 / время по javax.swing.Timer

3 / paintComponents вместо paint (для AWT Compoents и рисования DefaultXxxUI)

и сложите это вместе, например

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

public class AnimationJPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private int cx = 0;
    private int cy = 150;
    private int cw = 20;
    private int ch = 20;
    private int xinc = 1;
    private int yinc = 1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                AnimationJPanel panel = new AnimationJPanel();
                panel.setPreferredSize(new Dimension(400, 300));
                panel.animate();
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public AnimationJPanel() {
        setLayout(new BorderLayout());
        JLabel label = new JLabel("This is an AnimationJPanel");
        label.setForeground(Color.RED);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        add(label);
        setBackground(Color.BLACK);
        setForeground(Color.RED);
        setOpaque(true);
    }

    public void animate() {
        new Timer(15, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Rectangle oldCircle = new Rectangle(cx - 1, cy - 1, cw + 2, ch + 2);
                cx += xinc;
                cy += yinc;
                if (cx >= getWidth() - cw || cx <= 0) {
                    xinc *= -1;
                }
                if (cy >= getHeight() - ch || cy <= 0) {
                    yinc *= -1;
                }
                repaint(oldCircle);
                repaint(cx - 1, cy - 1, cw + 2, ch + 2);
            }
        }).start();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(cx, cy, cw, ch);
    }
}
...