#java #swing #jframe #jlabel
Вопрос:
Я пытаюсь создать простой скрипт, который позволит отображать всплывающие изображения и текст. Окно выскакивает, но оно пустое, на нем ничего нет. Кто — нибудь знает, что я делаю не так?
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.*;
public class Thermomter {
public static void main(String[] args) {
ImageIcon cold = new ImageIcon("cold_thermomtor.png");
JLabel label = new JLabel();
label.setIcon(cold);
label.setText("omg this is painfull");
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
frame.add(label);
}
}
Ответ №1:
Попробуйте поставить
frame.add(label);
во-первых, после:
JFrame frame = new JFrame();
Подобный этому:
JFrame frame = new JFrame();
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
Ответ №2:
Вызов frame.pack();
перед вызовом setVisible(true)
гарантирует, что все элементы внутри будут правильно определены по размеру перед их отображением.
Метод упаковки определяет размер рамки таким образом, чтобы все ее содержимое соответствовало или превышало их предпочтительные размеры […]
[…] пакет оставляет менеджера компоновки кадров ответственным за размер кадра, а менеджеры компоновки хорошо приспосабливаются к зависимостям платформы и другим факторам, влияющим на размер компонента.
Комментарии:
1. (1-) Начиная с JDK5 метод show() был заменен
setVisible(true)
методом.2. ах … прости, я старею.
3. Плюс один за упоминание
pack()
. Пожалуйста, отредактируйте свой ответ, чтобы обновить его доsetVisible(true)
метода, указанного @camickr, затем удалите последнее предложение и<strike>
. ИМО это был бы лучший подход и лучший ответ, чем принятый. Обновление: кстати — также удалите «(не знаю, действительно ли это необходимо?)» . Называюpack
лучшей практикой по ряду причин.