You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java Swing中JPanel无法显示且无报错问题求助

问题分析与解决方案

直接看你的代码,核心问题有两个,这也是导致面板无法显示、程序直接终止的根本原因:

  • JPanel不能单独作为顶层组件显示SplitRequestViewJPanel子类,而JPanel是轻量级容器,它必须依附JFrameJDialog这类顶层窗口才能被用户看到。直接调用setVisible(true)JPanel本身完全无效。
  • Swing代码未在事件调度线程(EDT)中执行:Swing是单线程模型,所有UI操作都必须在EDT中运行,否则会出现不可预测的行为(比如程序无提示终止)。

另外,你的构造方法里还有个冗余问题:rootPanel.add(headerPanel,BorderLayout.NORTH);被重复调用了两次,虽然不影响功能,但建议移除其中一次,优化代码结构。

修改后的完整可运行代码

import javax.swing.*;
import java.awt.*;

// 假设你已定义以下自定义组件:Constants, FinaWindowTitleLabel, FinaLabelStyle, FinaNewTextField, JTextFieldLimit, FinaCustomComboBox
public class SplitRequestView extends JPanel {

    public SplitRequestView(){
        try {
            System.out.println("Split view Called");
            setLayout(new BorderLayout(0,0));
            setBackground(Color.WHITE);
            JPanel rootPanel = new JPanel();
            rootPanel.setBackground(Color.WHITE);
            add(rootPanel, BorderLayout.CENTER);
            rootPanel.setLayout(new BorderLayout(0, 0));
            
            final JPanel headerPanel = new JPanel();
            headerPanel.setPreferredSize(new Dimension(10, 60));
            headerPanel.setBorder(null);
            headerPanel.setBackground(Constants.searchBackgroundColor);
            headerPanel.setLayout(new MigLayout("","10[][][grow]20","10[]10[]10"));
            JLabel lbl_title_split = new FinaWindowTitleLabel("Split");
            headerPanel.add(lbl_title_split, "cell 0 0,growx");
            JLabel lbl_title_product = new FinaWindowTitleLabel("Product Details");
            headerPanel.add(lbl_title_product, "cell 0 1,growx");
            rootPanel.add(headerPanel,BorderLayout.NORTH); // 保留一次添加即可
            
            final JPanel contentPanel = new JPanel();
            contentPanel.setBorder(null);
            contentPanel.setBackground(Color.WHITE);
            rootPanel.add(contentPanel, BorderLayout.CENTER);
            
            JPanel panelProdcutDetails = new JPanel();
            panelProdcutDetails.setBorder(null);
            panelProdcutDetails.setPreferredSize(new Dimension(445,50));
            panelProdcutDetails.setBackground(Color.WHITE);
            panelProdcutDetails.setLayout(new MigLayout("","10[35]5[35]5[35]5[35]5[35]5[35]5[35]5[35]10","10[]5[]5[]10"));
            contentPanel.add(panelProdcutDetails,BorderLayout.NORTH);
            
            JLabel lbl_pcode = new FinaLabelStyle("Product Code");
            panelProdcutDetails.add(lbl_pcode,"cell 0 0,growx");
            JLabel lbl_pcode_value = new FinaLabelStyle("P01");
            panelProdcutDetails.add(lbl_pcode_value,"cell 0 1,growx");
            JLabel lbl_pname = new FinaLabelStyle("Product Name");
            panelProdcutDetails.add(lbl_pname,"cell 1 0,growx");
            JLabel lbl_pname_value = new FinaLabelStyle("Sample Produt");
            panelProdcutDetails.add(lbl_pname_value,"cell 1 1,growx");
            JLabel lbl_internalbatch = new FinaLabelStyle("Internal Batch Id");
            panelProdcutDetails.add(lbl_internalbatch,"cell 2 0,growx");
            JLabel lbl_internalbatch_value = new FinaLabelStyle("P22");
            panelProdcutDetails.add(lbl_internalbatch_value,"cell 2 1,growx");
            JLabel lbl_supplierbatch = new FinaLabelStyle("Supplier Batch Id");
            panelProdcutDetails.add(lbl_supplierbatch,"cell 3 0,growx");
            JLabel lbl_supplierbatch_value = new FinaLabelStyle("P2202");
            panelProdcutDetails.add(lbl_supplierbatch_value,"cell 3 1,growx");
            JLabel lbl_uom = new FinaLabelStyle("UOM");
            panelProdcutDetails.add(lbl_uom,"cell 4 0,growx");
            JLabel lbl_uom_value = new FinaLabelStyle("10kg");
            panelProdcutDetails.add(lbl_uom_value,"cell 4 1,growx");
            JLabel lbl_currentstock = new FinaLabelStyle("Current Stock");
            panelProdcutDetails.add(lbl_currentstock,"cell 5 0,growx");
            JLabel lbl_currentstock_value = new FinaLabelStyle("10kg");
            panelProdcutDetails.add(lbl_currentstock_value,"cell 5 1,growx");
            
            JPanel panelSplit = new JPanel();
            panelSplit.setBorder(null);
            panelSplit.setPreferredSize(new Dimension(445,70));
            panelSplit.setBackground(Color.WHITE);
            panelSplit.setLayout(new MigLayout("","10[35]5[35]5[35]5[35]5[35]5[35]10","10[]5[]5[]10"));
            contentPanel.add(panelSplit,BorderLayout.CENTER);
            
            JLabel lbl_title = new FinaWindowTitleLabel("Split UOM");
            panelSplit.add(lbl_title,"cell 0 0,growx");
            JLabel lbl_qtytitle = new FinaLabelStyle("Quantity to be Converted");
            panelSplit.add(lbl_qtytitle,"cell 0 1,growx");
            JTextField txtQtytobeconverted = new FinaNewTextField();
            txtQtytobeconverted.setDocument(new JTextFieldLimit(30));
            txtQtytobeconverted.setColumns(12);
            panelSplit.add(txtQtytobeconverted,"cell 0 2,growx");
            JLabel lbl_convertuom = new FinaLabelStyle("Convert UOM");
            panelSplit.add(lbl_convertuom,"cell 1 1");
            JLabel lbl_convertuom_value = new FinaLabelStyle("Convert UOM Value");
            panelSplit.add(lbl_convertuom_value,"cell 1 2");
            JLabel lbl_to = new FinaLabelStyle("To");
            panelSplit.add(lbl_to,"cell 2 1");
            JLabel lbl_to_image = new FinaLabelStyle("to");
            panelSplit.add(lbl_to_image,"cell 2 2");
            JLabel lbl_target_uom = new FinaLabelStyle("Target UOM");
            panelSplit.add(lbl_target_uom,"cell 3 1");
            JComboBox<String> cmbBaseUOM = new FinaCustomComboBox();
            panelSplit.add(cmbBaseUOM,"cell 3 2");
            JLabel lbl_qty = new FinaLabelStyle("Qty");
            panelSplit.add(lbl_qty,"cell 4 1,growx");
            JTextField txtQty = new FinaNewTextField();
            txtQty.setDocument(new JTextFieldLimit(30));
            txtQty.setColumns(12);
            panelSplit.add(txtQty,"cell 4 2,growx");
        }catch(Exception ex){
            ex.printStackTrace();
            log.error("Error in Opening Split Window : "+ex.getMessage());
        }
    }

    public static void main(String[] args) {
        // 强制在事件调度线程中执行UI初始化
        SwingUtilities.invokeLater(() -> {
            // 创建顶层窗口容器JFrame
            JFrame frame = new JFrame("Split Request View");
            // 设置窗口关闭时程序正常退出
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 将自定义面板添加到窗口中
            frame.add(new SplitRequestView());
            // 自适应窗口大小
            frame.pack();
            // 窗口居中显示
            frame.setLocationRelativeTo(null);
            // 显示窗口
            frame.setVisible(true);
        });
    }
}

关键修改点说明

  1. 使用SwingUtilities.invokeLater:这是Swing开发的标准规范,确保所有UI代码在事件调度线程中执行,避免线程安全问题。
  2. 添加顶层容器JFrame:把SplitRequestView实例嵌入到JFrame中,通过顶层窗口的setVisible(true)来展示界面。
  3. 设置窗口关闭规则setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)保证关闭窗口时程序正常退出,不会残留后台进程。
  4. 移除冗余代码:删除了重复的组件添加语句,让代码更简洁。

其他场景调用示例

如果要从其他类中调用这个面板,同样需要将它添加到顶层容器中,比如弹窗形式:

// 在其他类中调用的示例代码
SwingUtilities.invokeLater(() -> {
    JDialog dialog = new JDialog(mainFrame, "Split Request", Dialog.ModalityType.APPLICATION_MODAL);
    dialog.add(new SplitRequestView());
    dialog.pack();
    dialog.setLocationRelativeTo(mainFrame);
    dialog.setVisible(true);
});

这样就能正常显示你的SplitRequestView面板了。

内容的提问来源于stack exchange,提问作者Balasubramanian

火山引擎 最新活动