Я знаю, что этот вопрос задан, но я не смог найти решение моей проблемы.
Я пытаюсь нарисовать анимацию в моей 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());
}
}
Спасибо!
Ваше окно (в частности, панель содержимого окна) по умолчанию использует диспетчер макетов 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);
setBackground(...)
вамsetBackground(...)
:-) Кроме того, избегайте установки свойств, как вы делаетеsetBackground(...)
внутри методаpaintComponent(...)
. Большинство макетов учитывают размеры компонента, в этом случаеJPanel
имеет размер(0, 0)
, поэтому он не отображается. Попробуйтеoverride
метод JComponent.getPreferredSize () (пример)