Не добавяте променливата на вашия панел към contentPane на вашия JFrame.
добавете:
public MyFrame() {
setTitle("MyFrame");
// setSize(300, 200); // let's avoid this
setDefaultCloseOperation(EXIT_ON_CLOSE);
MyPanel panel = new MyPanel();
JButton testButton = new JButton("Test");
panel.add(testButton);
add(panel); // *** here
pack(); // this tells the layout managers to do their thing
setLocationRelativeTo(null);
setVisible(true);
}
Като странична бележка:
public MyPanel() {
this.setOpaque(true);
this.setVisible(true);
}
JPanel са непрозрачни и видими по подразбиране, така че вашите извиквания на метод в рамките на конструктора MyPanel не правят нищо полезно.
Странична бележка 2: Рядко, ако някога, разширявам JFrame или друг прозорец от най-високо ниво (с изключение на JApplet, ако съм принуден да използвам един от тях), тъй като рядко променям вроденото поведение на прозореца. По-добре мисля да създам моите прозорци от най-високо ниво (т.е. моите JFrames), когато е необходимо.
Странична бележка 3: Винаги се стремете да стартирате вашия Swing GUI в нишката на събитието на Swing. Така че...
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
Редактиране
Питате:
Написахте да избягваме задаването на размера.. можете ли да ми кажете как мога да го опаковам, но да задам минимален размер на рамката?
Обичам да замествам метода getPreferredSize()
на JPanel и да го накарам да връща измерение, което има смисъл.
Например, можете да направите нещо подобно, за да сте сигурни, че вашият GUI е с размер най-малко PREF_W на PREF_H:
import java.awt.Dimension;
import javax.swing.*;
public class ShowGetPreferredSize extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
@Override
public Dimension getPreferredSize() {
Dimension superSize = super.getPreferredSize();
if (isPreferredSizeSet()) {
return superSize;
}
int w = Math.max(superSize.width, PREF_W);
int h = Math.max(superSize.height, PREF_H);
return new Dimension(w, h);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("ShowGetPreferredSize");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new ShowGetPreferredSize());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
person
Hovercraft Full Of Eels
schedule
04.02.2015