Java 为什么内容没有出现?但当调整帧时,它会出现

Java 为什么内容没有出现?但当调整帧时,它会出现,java,swing,frame,Java,Swing,Frame,我现在用Frame创建一个简单的程序。一、 但是,面临一个未知错误,即除了框架上尺寸为90*90的面板外,任何内容都不会出现。当我通过拖动来调整窗口大小时,内容将按预期显示。我已经厌倦了谷歌搜索的一些方法。。尽管如此。。不工作 为了说明这一点,我将附上几个截图 鼠标拖动前 鼠标拖动后 Java代码: import java.awt.Color; import java.awt.Container; import javax.swing.*; import javax.swing.

我现在用Frame创建一个简单的程序。一、 但是,面临一个未知错误,即除了框架上尺寸为90*90的面板外,任何内容都不会出现。当我通过拖动来调整窗口大小时,内容将按预期显示。我已经厌倦了谷歌搜索的一些方法。。尽管如此。。不工作

为了说明这一点,我将附上几个截图

  • 鼠标拖动前

  • 鼠标拖动后

Java代码:

    import java.awt.Color;
import java.awt.Container;
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

class menuListener implements MenuListener {

    @Override
    public void menuSelected(MenuEvent e) {
        // TODO Auto-generated method stub
        System.out.println("menu clicked !");
        System.exit(0);
    }

    @Override
    public void menuDeselected(MenuEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void menuCanceled(MenuEvent e) {
        // TODO Auto-generated method stub

    }

}

public class pcMain extends JFrame implements Runnable {
    userSeat us;
    int user;
    JPanel[] userSeat;
    Container con;
    JPanel leftPane, rightPane;
    JMenuBar jm;
    JMenu exit;

    public pcMain(int user) {

        super("Pc Management Application");

        con = getContentPane();
        con.setBackground(new Color(0, 128, 128));

        setVisible(true);
        setSize(1100, 500);
        // setLayout(null);
        this.setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Menu bar
        jm = new JMenuBar();

        // Menu items
        exit = new JMenu("EXIT");
        exit.addMenuListener(new menuListener());

        // letPanel
        leftPane = new JPanel();
        leftPane.setLayout(null);
        // leftPane.setSize(800, 470);
        leftPane.setBorder(BorderFactory.createLineBorder(Color.black));
        leftPane.setOpaque(false);
        leftPane.setBounds(0, 0, 800, 500);

        // rightPanel
        rightPane = new JPanel();
        // rightPane.setSize(300, 470);
        rightPane.setBorder(BorderFactory.createLineBorder(Color.red));
        rightPane.setOpaque(false);
        rightPane.setBounds(800, 0, 300, 500);

        // adding all components
        this.user = user;
        jm.add(exit);
        us = new userSeat(user);
        userSeat = us.getSeat();
        setJMenuBar(jm);
        // add(leftPane);
        // add(rightPane);

    }

    @Override
    public void run() {

        int seatX = 10;
        int seatY = 10;

        // Add user seats into leftPane
        for (int i = 0; i < user; i++) {

            if (i != 0 && i % 5 == 0) {
                // Increase y value
                System.out.println("if : " + i);
                seatX = 10;
                seatY += 100;
            }

            // Increase x values
            userSeat[i].setLocation(seatX, seatY);
            leftPane.add(userSeat[i]);
            // add(leftPane);
            System.out.println("else :" + i);
            seatX += 95;

        }

        add(leftPane);

    }

    public static void main(String[] args) {
        new Thread(new pcMain(10)).start();

    }

}
导入java.awt.Color;
导入java.awt.Container;
导入javax.swing.*;
导入javax.swing.event.MenuEvent;
导入javax.swing.event.MenuListener;
类menuListener实现menuListener{
@凌驾
已选择公共无效菜单(菜单事件e){
//TODO自动生成的方法存根
System.out.println(“单击菜单!”);
系统出口(0);
}
@凌驾
已选择公共作废菜单(菜单事件e){
//TODO自动生成的方法存根
}
@凌驾
公共作废菜单已取消(菜单事件e){
//TODO自动生成的方法存根
}
}
公共类pcMain扩展JFrame实现Runnable{
让我们坐下来;
int用户;
JPanel[]用户席位;
集装箱集装箱;
JPanel左窗格、右窗格;
jmenubarjm;
JMenu出口;
公共pcMain(int用户){
超级(“Pc管理应用程序”);
con=getContentPane();
con.setBackground(新颜色(0、128、128));
setVisible(真);
设置大小(1100500);
//setLayout(空);
此.setLocationRelativeTo(空);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//菜单栏
jm=新的JMenuBar();
//菜单项
退出=新JMenu(“退出”);
addMenuListener(新的menuListener());
//出租配电盘
leftPane=newjpanel();
leftPane.setLayout(null);
//左窗格。设置大小(800470);
setboorder(BorderFactory.createLineBorder(Color.black));
leftPane.set不透明(false);
左窗格.立根(0,0,800,500);
//右面板
rightPane=newjpanel();
//右窗格。设置大小(300470);
setboorder(BorderFactory.createLineBorder(Color.red));
右窗格。设置不透明(false);
右窗格.立根(800,0300500);
//添加所有组件
this.user=用户;
jm.add(退出);
us=新用户席位(用户);
userSeat=us.getSeat();
setJMenuBar(jm);
//添加(左窗格);
//添加(右窗格);
}
@凌驾
公开募捐{
int seatX=10;
int seatY=10;
//将用户座位添加到左窗格
for(int i=0;i
正如@Kiheru所说,我将setVisibe()方法移到了最后一个,为了让它工作,我在添加左窗格后添加了两个方法repaint()&revalidate()

见下表:


谢谢大家:)

1。Swing是单线程的。不要在事件分派线程之外修改swing组件。2.在添加所有组件和包装框架后,应最后设置框架可见。(3.如果已经可见的组件需要添加或删除新组件,则需要重新验证和重新喷漆)@Kiheru,非常感谢!这是我期待的工作!!祝您有个美好的一天!为什么不呢?展示一下@kiheru的评论是如何发挥作用的。请不要使用空布局,而是使用空布局。Swing的设计就是为了和他们一起工作。有关更多信息,请参阅和OliverPoulin's。大多数情况下,出现这种错误是因为您使用的是空布局。谢谢大家!我将这样做:)未来注意:更改代码的文本比(漂亮的)彩色代码的屏幕截图更有用!