Java - setVisible(true) не влияет на GUI

Я создал GUI (называемый ParameterUI) с помощью Netbeans GUI Builder, и теперь я хочу создать его экземпляр и отобразить его. Однако, используя

ParameterUI gui = new ParameterUI();
gui.setVisible(true);

окно не появляется... Тестирование показывает, что после этих команд gui.isVisible() возвращает true, а gui.isValid() - false. Вызов gui.revalidate() также не имеет никакого эффекта.

В классе ParameterUI метод конструктора генерируется Netbeans и просто

public class ParameterUI extends javax.swing.JPanel {
    public ParameterUI() {
        initComponents();
    }
}

initComponents - это просто список того, где будет размещена каждая jPanel и т. д.

Странно то, что, когда я сделал учебный графический интерфейс пользователя с учебником по адресу http://netbeans.org/kb/docs/java/gui-functionality.html, графический интерфейс был установлен в качестве основного класса, несмотря на отсутствие основного метода и GUI появился сам по себе.

К сожалению, я новичок в GUI (я использую конструктор, потому что у меня нет времени, чтобы научиться делать правильный GUI ручной работы), но может кто-нибудь сказать мне, как сделать мой GUI видимым? Я могу предоставить больше кода, если это необходимо...

РЕДАКТИРОВАТЬ: я пытался

JFrame window = new JFrame();
ParameterUI gui = new ParameterUI();
window.setContentPane(gui);
window.pack();
window.setVisible(true);

прочитав короткое руководство по JFrames, но оно, похоже, ничего не меняет...

2 ответа

Решение

Используете ли вы JFrame или вы создали приложение для рабочего стола с Netbeans? Потому что, если вы создали настольное приложение, у Netbeans есть собственный класс, который он использует, и у меня также было много проблем с ним... поэтому я предлагаю вам использовать JFrame. В любом случае, вы можете попробовать это, чтобы увидеть, запускает ли пользовательский интерфейс:

SwingUtilities.invokeLater(new Runnable() {
           public void run()
           {
               ParameterUI gui = new ParameterUI();
               gui.setVisible(true);
           }
       });

Поскольку вы расширяете JPanel, вам нужно поместить панель на JFrame, чтобы она была видна. Для этого в netbeans просто создайте новый JFrame (щелкните правой кнопкой мыши по пакету и выберите "New JFrame"). Теперь вернитесь на свою панель, на левом поле (в разделе "Проект", "Файлы" и т. Д.) У вас должен быть элемент с именем "Инспектор". Нажмите на него, и вы увидите древовидное представление ваших компонентов. Щелкните правой кнопкой мыши на JPanels, которые вы хотите видеть, и выберите "Копировать". Вернитесь к только что созданному JFrame, найдите кнопку "Инспектор" с левого поля щелкните по нему, и сверху у вас должен появиться элемент с именем "[JFrame]". Щелкните правой кнопкой мыши по этому элементу и выберите "Вставить". Теперь вы должны увидеть созданную вами панель.

Чтобы просмотреть панель, просто введите имя JFrame вместо ParameterUI

setVisible() для компонента устанавливает флажок в этом компоненте (помимо прочего, вас это не особо волнует в данный момент). Этот флаг проверяется контейнером, содержащим ваш компонент, чтобы увидеть, нужно ли показывать компонент.

setVisible() в окне определяет, отображается ли окно на экране. Теперь все, что он делает, это заставляет ваше окно появляться или исчезать. Как правило, вы хотите указать его размер и местоположение, прежде чем сделать его видимым. pack() а также setLocationRelativeTo() полезны здесь.

Чтобы увидеть ваш графический интерфейс, ParameterUI либо должен продлить Window (наверное JFrame или же JDialog) или он должен содержаться в окне, и вы должны позвонить setVisible(true) на окне вместо ParameterUI пример. Простой пример этого (непроверенный):

// expected to be called on the AWT/Event Dispatch Thread
public void show(ParameterUI ui) {
  JFrame frame = new JFrame();
  frame.setLayout(new BorderLayout());
  frame.add(ui, BorderLayout.CENTER);
  frame.pack();
  frame.setLocationRelativeTo(null); // position in the center of the screen
  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  frame.setVisible(true);
}
Другие вопросы по тегам