Swing был впервые добавлен в JDK в 1998 году и с тех пор претерпел множество изменений. К сожалению, когда вы читаете веб-страницы о Swing , неясно, когда эта страница последний раз обновлялась. Следовательно, вы можете изучать устаревшие методы написания Swing кода.
Прежде всего, согласно опубликованному коду, класс button
не должен расширять класс JFrame
, поскольку выиспользуйте статическую переменную в качестве JFrame
вашего приложения. Кроме того, JFrame
является контейнером верхнего уровня, что делает его контейнером особого вида, а не континуатором, аналогичным JPanel
. Вам необходимо установить менеджер раскладки для JPanel
, а затем добавить JLabel
, JTextField
и JButton
к этому JPanel
. А затем добавьте JPanel
к JFrame
.
. Метод вызова pack()
класса JFrame
автоматически установит предпочтительные размеры для компонентов внутри JFrame
. Это показано в приведенном ниже коде.
Также обратите внимание на Соглашения о кодировании Java , которые позволяют другим пользователям легче читать и понимать ваш код. И обратите внимание, что в соответствии с этими соглашениями я переименовал ваш класс с button
на Buttons
, а также потому, что в JDK уже есть несколько классов с именем Button
.
Вот мое переписывание вашего кода...
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class Buttons implements Runnable {
public void run() {
createAndShowGui();
}
private void createAndShowGui() {
JFrame f = new JFrame("Box");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel p = new JPanel();
BoxLayout layout = new BoxLayout(p, BoxLayout.Y_AXIS);
p.setLayout(layout);
JLabel l = new JLabel("panel label");
JTextField textField = new JTextField(5);
JButton b = new JButton("button1");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Random r = new Random();
textField.setText(String.valueOf(r.nextBoolean()));
}
});
p.add(l);
p.add(textField);
p.add(b);
f.add(p);
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
}
public static void main(String[] args) {
Buttons instance = new Buttons();
EventQueue.invokeLater(instance);
}
}