JPanel не отображается в JFrame

1

Я знаю, что этот вопрос задан, но я не смог найти решение моей проблемы.

Я пытаюсь нарисовать анимацию в моей JPanel, которая будет в JFrame. JPanel не отображается, JFrame виден, а также тег тестирования, который я в него вложил. Кроме того, я не могу установить фон JFrame по какой-то причине. Здесь код, который не работает: (Конструктор находится в другом классе в проекте).

public class WindowClass extends JPanel implements ActionListener{

Graphics graphics;
JFrame window;
Timer timer;

private JLabel label = new JLabel("Best Label Around");
private int height;
private int width;
private Color bgColor;


public void init(){

    window = new JFrame("Jumping Balls");
    window.add(this);
    window.add(label);
    this.setSize(150,150);
    window.setSize(500, 300);
    window.setDefaultCloseOperation(window.EXIT_ON_CLOSE);
    window.setVisible(true);
    setVisible(true);
    //timer = new Timer(100, this); //TODO
    //timer.start();

}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(Color.BLUE);
}

BTW - вот еще один, очень похожий код для другой программы, который работает, я понятия не имею, почему, это действительно взрывает мой разум. Вот некоторые из его кода:

public class ShowClass extends JPanel implements ActionListener{

int count=0;

Graphics graphics;
JFrame window;
Timer timer;
Random random = new Random();

Color generalColor = Color.BLACK;

int wHeight = 400;
int wWidth = 550;

final int MAXSIZE = 60; //Ball Maximum Size

//BackGround colors
int randomRed = 100;
int randomGreen = 100;
int randomBlue = 100;

//Ball colors 
int randomBallRed = 255;
int randomBallGreen = 255;
int randomBallBlue = 255;

public void init(){

    window = new JFrame("Jumping Balls");
    window.add(this);
    window.setSize(wHeight, wWidth);
    window.setDefaultCloseOperation(window.EXIT_ON_CLOSE);
    window.setVisible(true);

    timer = new Timer(100, this); //TODO
    timer.start();

}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(new Color(randomRed,randomGreen,randomBlue)); 

    for(Ball b : ManagerClass.balls){
        //b.setBallColor(new Color(randomRed,randomGreen,randomBlue)); TODO
        g.setColor(b.getBallColor());
        g.fillOval((int)b.getLocation().getX(),(int)b.getLocation().getY(),b.getHeight(),b.getWidth());
    }

}

Спасибо!

  • 0
    Как вы хотите расположить ярлык и панель в окне?
  • 0
    Пожалуйста, взгляните на эту ветку, поскольку JComponent не отображает фоновый рисунок . Надеемся, что это может setBackground(...) вам setBackground(...) :-) Кроме того, избегайте установки свойств, как вы делаете setBackground(...) внутри метода paintComponent(...) . Большинство макетов учитывают размеры компонента, в этом случае JPanel имеет размер (0, 0) , поэтому он не отображается. Попробуйте override метод JComponent.getPreferredSize () (пример)
Показать ещё 2 комментария
Теги:
swing
jpanel
jframe
visibility

1 ответ

2

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

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

Эта:

window.add(this);
window.add(label);

добавляет this в центральное положение. Затем он добавляет label в центральное положение, что устраняет this поскольку только один компонент может находиться в центре.

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

window.add(this, BorderLayout.CENTER); // or just window.add(this);
window.add(label, BorderLayout.NORTH);
  • 0
    Этикетка предназначена только для тестирования, если она видна. метка отображается в левом размере рамки, поэтому я предполагаю, что панель занимает центр рамки.
  • 0
    @YosefBro только потому, что метка ничего не отображает в большей части пространства, не означает, что она не занимает это пространство.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню