我是java新手,但知道swing的基础知识和大多数库,我想知道为什么我最近制作的这个实践程序没有将JButton定位在正确的坐标上。我难住了。这是源代码。
package game;
import java.awt.Color;
import java.awt.Image;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JButton;
public class TitleScreen extends JFrame
{
JFrame window = new JFrame();
JPanel screen = new JPanel();
JButton start = new JButton("Play Game");
JButton end = new JButton("Quit Game");
ImageIcon thing = new ImageIcon("lol.png");
Image pic = thing.getImage();
public TitleScreen()
{
window.setTitle("Test");
window.setSize(500,500);
window.setBackground(Color.BLUE);
window.setLocationRelativeTo(null);
window.setResizable(false);
window.setVisible(true);
}
public void canvas()
{
screen.setLayout(null);
window.add(screen);
start.setBounds(250,250,100,50);
screen.add(start);
}
public static void main(String[] args)
{
TitleScreen TitleScreen = new TitleScreen();
}
这是因为您没有调用canvas
方法,这就是为什么它没有显示。
解决方案:
public TitleScreen()
{
window.setTitle("Test");
window.setSize(500,500);
window.setLocationRelativeTo(null);
screen.setBackground(Color.BLUE);
window.setVisible(true);
canvas();
}
几点:
-
不要使用
null
布局,而是使用适合您需要的适当布局关于如何使用各种布局管理器
值得一读 使用
SwingUtilities.invokeLater()
确保EDT正确初始化。阅读更多
为什么要使用swingutility。invokeLater in main method?
SwingUtilities.invokeLater
始终在添加完所有分量后最后调用
JFrame#setVisible(true)
阅读更多JFrame setBackground的用途
应该是这样的:
public void canvas() {
screen.setBackground(Color.BLUE);
screen.add(start);
window.add(screen);
}
public TitleScreen() {
...
canvas();
window.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TitleScreen TitleScreen = new TitleScreen();
}
});
}