Java JTable不出现

Java JTable不出现,java,swing,jtable,layout-manager,Java,Swing,Jtable,Layout Manager,每当我将面板的布局设置为FlowLayout,就会出现JTable,但是我的imageBackground和按钮放错了位置。当我将布局设置为null时,表中的图标不会出现,但是按钮和imageBackground就是我想要的位置。我该怎么办 public class AssetPanel extends JPanel implements ActionListener{ private ArrayList<AssetDetails> assetList; privat

每当我将面板的布局设置为
FlowLayout
,就会出现
JTable
,但是我的
imageBackground
和按钮放错了位置。当我将布局设置为null时,表中的图标不会出现,但是按钮和
imageBackground
就是我想要的位置。我该怎么办

public class AssetPanel extends JPanel implements ActionListener{
    private ArrayList<AssetDetails> assetList;
    private Frame frame;
    private Database db;

    private JTable assetTable;
    private JScrollPane scrollPane;

    private JButton btnBack;
    private JButton btnView;

    public AssetPanel (Frame frame){
        super();
        this.frame = frame;
        initialize();
    }

    public void initialize(){
        setName("Assets");
        setSize(700, 475);
        setLayout(null);
        setVisible(true);

        db = new Database();

        btnView = new JButton("View");
        btnView.addActionListener(this);
        btnView.setBounds(450, 400, 90, 20);
        add(btnView);

        btnBack = new JButton("Back");
        btnBack.setFont(new Font("Tahoma", Font.BOLD, 12));
        btnBack.setBounds(550, 400, 90, 20);
        btnBack.addActionListener(this);
        add(btnBack);

        ImageIcon imageBackground = new ImageIcon(AssetPanel.class.getResource("/resources/assets.png"));
        JLabel jlBackground  = new JLabel(imageBackground);
        jlBackground.setBounds(0,0, 700, 475);
        add(jlBackground);
        initializeTable();
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource() == btnBack){
            frame.changePanel("Main Menu");
        }
    }

    public void initializeTable(){
        Object[][] assetData;
        assetList = new ArrayList<>();
        String[] columnNames = {"Asset Name", "Date Acquired", "Type", "Classification"};
        assetList = db.getAssetTable();

        assetData = new Object[assetList.size()][columnNames.length];
        for(int i = 0; i < assetList.size(); i++){
            assetData[i][0] = assetList.get(i).getAssetName();
            assetData[i][1] = assetList.get(i).getDateAcquired();
            assetData[i][2] = assetList.get(i).getType();
            assetData[i][3] = assetList.get(i).getClassification();
        }

        assetTable = new JTable(assetData, columnNames);
        assetTable.setPreferredScrollableViewportSize(new Dimension(400, 100));
        assetTable.setLocation(150, 100);
        assetTable.setFillsViewportHeight(true);

        scrollPane = new JScrollPane(assetTable);
        add(scrollPane);
    }
}
公共类AssetPanel扩展JPanel实现ActionListener{
私人ArrayList资产清单;
专用框架;
专用数据库数据库;
私人可转让资产;
私有JScrollPane滚动窗格;
私人JButton btnBack;
私人JButton btnView;
公共AssetPanel(框架){
超级();
this.frame=frame;
初始化();
}
公共无效初始化(){
集合名(“资产”);
设置大小(700475);
setLayout(空);
setVisible(真);
db=新数据库();
btnView=新的JButton(“视图”);
btnView.addActionListener(此);
btnView.setBounds(450,400,90,20);
添加(btnView);
btnBack=新的JButton(“Back”);
setFont(新字体(“Tahoma”,Font.BOLD,12));
btnBack.倒退(550,400,90,20);
btnBack.addActionListener(此);
添加(btnBack);
ImageIcon imageBackground=新的ImageIcon(AssetPanel.class.getResource(“/resources/assets.png”);
JLabel jlBackground=新的JLabel(imageBackground);
jlbackgrounds.setBounds(0,0700475);
增加(背景);
初始化表();
}
@凌驾
已执行的公共无效行动(行动事件ae){
如果(ae.getSource()==btnBack){
框架变更面板(“主菜单”);
}
}
public void initializeTable(){
对象[][]资产数据;
assetList=newarraylist();
String[]columnNames={“资产名称”、“获取日期”、“类型”、“分类”};
assetList=db.getAssetTable();
assetData=新对象[assetList.size()][columnNames.length];
对于(int i=0;i
关于可能的解决方案:我建议切换到Mig布局作为所有java布局问题的解决方案。现在,我将其用于应用程序中每个容器组件的布局。如果你换了,你可能会很高兴你这么做了(再也不会有像这个问题中列出的那样的问题了)


MigLayout可能包含在java未来版本的JDK中。

不要使用空布局或使用setBounds()方法定位和调整组件大小

但是,我的图像背景和按钮放错了位置

背景是一个容器组件。也就是说,将其创建为组件并绘制图像作为背景。然后将其他组件添加到背景组件。现在,图像将显示在背景中,其他组件将显示在其顶部


请参阅以给出创建背景组件的示例。

空布局意味着您必须明确放置所有组件

我推荐BoxLayout。这真的很简单,你可以在对象之间放置间隔符来创建空间,然后用胶水来填充所有剩余的空间

您还可以嵌套这些框

如果您查看java示例代码(以及源代码);
它们嵌套了许多JPanel以获得复杂的布局

如果不起作用,请在尝试以下步骤之前尝试添加此选项:

// Set your flow layout thus:
setLayout(new FlowLayout(FlowLayout.LEFT,5,5));

// Set your table Auto Resize Mode to OFF
assetTable.setAutoResizeMode(assetTable.AUTO_RESIZE_OFF);
额外提示:如果上述提示没有帮助,请尝试

  • 从技术上讲,您的类应该扩展JFrame。 向类(即JFrame)添加根布局:
setLayout(新的FlowLayout(FlowLayout.LEFT,5,5))

  • 创建两个面板;其中应包含标签和按钮组件。 另一个应该包含包含表的JScrollPane。 两个面板都可以具有其布局,该布局决定了组件的布局方式。 您可以使用FlowLayout

  • 然后可以将两个面板添加到主布局(JFrame)


设置flowlayout时,您遇到了哪些问题,哪些问题会被挤压到哪里?我将如何处理这些问题?使用。您可能希望使用JLayeredPane。