В двух словах легко запомнить PECS
<? extends T>
, если вам нужно извлечь объект типа T
из коллекции. <? super T>
, если вам нужно поместить объекты типа T
в коллекцию. , но когда я его запускаю, я получаю следующее:
blockquote>Вы получаете пустой экран, потому что вы добавляете компоненты в кадр после того, как кадр виден.
- Как уже было предложено, вам необходимо использовать соответствующий менеджер макетов. FlowLayout проще всего начать с.
- вызывать
setVisible(true)
ПОСЛЕ добавления компонентов к кадру.Таким образом, код должен быть больше похож:
panel.add(...); panel.add(...); add(panel); pack(); setVisible(true);
Не добавляйте компоненты непосредственно в ваш фрейм. Вместо этого добавьте в область содержимого , где 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
конструктором.
Я согласен с предложениями MadProgrammer (+1)
Хорошо, давайте взглянем на вашу программу, хотя
На самом деле вы создали JFrame с компонентами в нем. Его работа также прекрасна, но ваш вопрос «почему мои предметы не отображаются в JFrame» не потому, что вы сделали что-то неправильно, а потому что пропустили что-то, то есть revalidate ()
Попробуйте:
public static void main(String[] args){
FirstGUI a = new FirstGUI();
a.GUI();
a.revalidate();
}
Я не говорю, что это даст вам идеальный интерфейс. То, что я пытаюсь сказать, это поможет вам лучше понять Swing. Узнайте о менеджерах Swing Layout, а затем поработайте над своим пользовательским интерфейсом, чтобы получить лучшие результаты.
revalidate (): этот компонент и все его родители над ним отмечены как необходимо, чтобы их выложили. Это означает, что Менеджер макета попытается перестроить компоненты. Часто используется после удаления компонентов. Возможно, что некоторые действительно острые люди могут пропустить это. Я думаю, что вы будете знать это только в том случае, если вы используете Swing.
Менеджером по умолчанию для JFrame
является BorderLayout
.
Это означает, что ваши компоненты по существу все добавлены друг к другу.
Попробуйте изменить диспетчер компоновки например, FlowLayout
(например) ...
[/g4]
Взгляните на Визуальное руководство для менеджеров макетов и Использование менеджеров компоновки .
Кроме того, избегайте setSize
, если это возможно, используйте Window#pack
вместо
] Обновить
Я также хотел бы познакомить вас с Initial Threads , который должен использоваться для запуска вашего кода пользовательского интерфейса ...
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);
}
}
Единственная причина:
setVisible(True); method for the frame should be put on the end of the code.
, если вы укажете эту строку в верхней части кода, который создается при создании фрейма. Это вызовет эту проблему.
setVisible
– MadProgrammer 7 May 2013 в 02:19