Невозможно отобразить функции с помощью JFrame [duplicate]

В двух словах легко запомнить PECS

  1. Используйте подстановочный символ <? extends T>, если вам нужно извлечь объект типа T из коллекции.
  2. Используйте кнопку <? super T>, если вам нужно поместить объекты типа T в коллекцию.
  3. Если вам нужно удовлетворить обе вещи, ну, не используйте подстановочный знак. Так просто, как это.
1
задан Col1107 7 May 2013 в 01:52
поделиться

6 ответов

, но когда я его запускаю, я получаю следующее:

Вы получаете пустой экран, потому что вы добавляете компоненты в кадр после того, как кадр виден.

  1. Как уже было предложено, вам необходимо использовать соответствующий менеджер макетов. FlowLayout проще всего начать с.
  2. вызывать setVisible(true) ПОСЛЕ добавления компонентов к кадру.

Таким образом, код должен быть больше похож:

panel.add(...);
panel.add(...);
add(panel);
pack();
setVisible(true);
6
ответ дан camickr 18 August 2018 в 03:49
поделиться
  • 1
    +1 для setVisible – MadProgrammer 7 May 2013 в 02:19
  • 2
    Слава богу, есть умные люди, которые напоминают вам взглянуть на порядок ваших кодовых строк. Спасибо, сэр. – IchHabsDrauf 17 August 2017 в 18:17

Не добавляйте компоненты непосредственно в ваш фрейм. Вместо этого добавьте в область содержимого , где JFrame хранит все компоненты, которые он рисует. Обычно это JPanel.

Вот пример:

public class GUI
{

    private JPanel content;

    public void GUI
    {
        /*Other code*/

        content = new JPanel();
        add(content); //make content the content pane

        content.add(title);
        content.add(login);
        content.add(pass);
    }

Если это не удается, вызовите setVisible(true) и setEnabled(true) для всех ваших компонентов.

На боковой ноте вы можете сделать свой конструктор GUI конструктором.

0
ответ дан ApproachingDarknessFish 18 August 2018 в 03:49
поделиться

Я согласен с предложениями MadProgrammer (+1)

Хорошо, давайте взглянем на вашу программу, хотя

На самом деле вы создали JFrame с компонентами в нем. Его работа также прекрасна, но ваш вопрос «почему мои предметы не отображаются в JFrame» не потому, что вы сделали что-то неправильно, а потому что пропустили что-то, то есть revalidate ()

Попробуйте:

public static void main(String[] args){
        FirstGUI a = new FirstGUI();
        a.GUI();
        a.revalidate();
    }

Я не говорю, что это даст вам идеальный интерфейс. То, что я пытаюсь сказать, это поможет вам лучше понять Swing. Узнайте о менеджерах Swing Layout, а затем поработайте над своим пользовательским интерфейсом, чтобы получить лучшие результаты.

revalidate (): этот компонент и все его родители над ним отмечены как необходимо, чтобы их выложили. Это означает, что Менеджер макета попытается перестроить компоненты. Часто используется после удаления компонентов. Возможно, что некоторые действительно острые люди могут пропустить это. Я думаю, что вы будете знать это только в том случае, если вы используете Swing.

1
ответ дан Madhur Mehta 18 August 2018 в 03:49
поделиться

Менеджером по умолчанию для JFrame является BorderLayout.

Это означает, что ваши компоненты по существу все добавлены друг к другу.

Попробуйте изменить диспетчер компоновки например, FlowLayout (например) ...

enter image description here [/g4]

Взгляните на Визуальное руководство для менеджеров макетов и Использование менеджеров компоновки .

Кроме того, избегайте setSize, если это возможно, используйте Window#pack вместо

] Обновить

Я также хотел бы познакомить вас с Initial Threads , который должен использоваться для запуска вашего кода пользовательского интерфейса ...

1
ответ дан MadProgrammer 18 August 2018 в 03:49
поделиться
import javax.swing.*;
import java.awt.*;
class Myframec extends JFrame
{

    Myframec()
    {
        Container c = this.getContentPane();
        c.setLayout(null);

        this.setBounds(10,10,700,500);
        this.setTitle("Welcome");

        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setBounds(0,0,700,500);
        panel.setBackground(Color.gray);
        panel.setLayout(null);
        c.add(panel);
        Font f = new Font("Arial",Font.BOLD,25);
        Font f1 = new Font("Arial",Font.BOLD,20);
        JLabel lable = new JLabel();
        lable.setBounds(130,10,400,100);
        lable.setText("Apple Inc. Member Login Port");
        lable.setFont(f);
        panel.add(lable);
        JTextField login = new JTextField("Login",10);
        login.setBounds(120,150,400,30);
        login.setFont(f1);
        panel.add(login);
        JPasswordField pass =new JPasswordField("Password");
        pass.setBounds(120,200,400,30);
        pass.setFont(f1);


        lable.setFont(f);
        panel.add(pass);
        c.setVisible(true);
        this.setVisible(true);
    }
    public static void main(String[] argm)
    {
        Myframec frame = new Myframec();
        frame.setVisible(true);
    }
}
-1
ответ дан MikaS 18 August 2018 в 03:49
поделиться
  • 1
    Пожалуйста, добавьте объяснение того, как работает этот код (путем редактирования ответа). – MikaS 27 January 2018 в 18:20

Единственная причина:

setVisible(True); method for the frame should be put on the end of the code.

, если вы укажете эту строку в верхней части кода, который создается при создании фрейма. Это вызовет эту проблему.

1
ответ дан user 18 August 2018 в 03:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: