0

每当我将面板的 Layout 设置为FlowLayout时,JTable就会出现,但是我的imageBackground和按钮放错了位置。当我将布局设置为空时,表格不会出现,但按钮和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);
    }
}
4

4 回答 4

1

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

但是我的 imageBackground 和按钮放错了位置

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

请参阅背景面板以提供创建背景组件的示例。

于 2013-06-25T16:09:39.677 回答
0

关于可能的解决方案:我建议切换到 Mig Layout 作为所有 Java 布局问题的解决方案。我现在将它用于我的应用程序中每个容器组件的布局。如果您切换,您可能会很高兴您这样做了(永远不会再遇到此问题中列出的问题)。

http://www.miglayout.com/

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

于 2013-06-25T16:01:39.993 回答
0

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

// 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(new FlowLayout(FlowLayout.LEFT,5,5));

  • 创建两个面板;一个应该包含您的标签和按钮组件。另一个应包含包含您的表的 JScrollPane。两个面板都可以有自己的 Layout 来确定组件的布局方式。您可以使用 FlowLayout。

  • 然后,您可以将两个面板添加到母布局 (JFrame)。

于 2013-06-26T13:10:48.943 回答
0

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

我推荐 BoxLayout。这真的很简单,您可以放入垫片以在对象之间创建空间,并用胶水填充所有剩余空间。

你也可以嵌套盒子。

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

于 2013-06-25T23:46:53.657 回答