0

パネルのレイアウトを に設定すると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);
    }
}
4

4 に答える 4

1

null レイアウトを使用したり、setBounds() メソッドを使用してコンポーネントの位置とサイズを変更したりしないでください。

ただし、私のimageBackgroundとボタンは間違っています

背景はコンテナ コンポーネントです。つまり、コンポーネントとして作成し、背景として画像をペイントします。次に、他のコンポーネントを背景コンポーネントに追加します。画像が背景に表示され、他のコンポーネントがその上に表示されます。

背景コンポーネントの作成例については、背景パネルを参照してください。

于 2013-06-25T16:09:39.677 に答える
0

null レイアウトは、すべてのコンポーネントを明示的に配置する必要があることを意味します。

BoxLayout をお勧めします。それは本当に簡単で、スペーサーを入れてオブジェクト間にスペースを作り、接着剤で残りのスペースをすべて埋めることができます.

ボックスをネストすることもできます。

Javaサンプルコード(および物事のソース)を見ると; 複雑なレイアウトを取得するために、多くの JPanel をネストします。

于 2013-06-25T23:46:53.657 に答える
0

考えられる解決策: すべての Java レイアウトの問題に対する解決策として、Mig Layout に切り替えることをお勧めします。今では、アプリ内のすべてのコンテナー コンポーネントのレイアウトに使用しています。切り替えた場合、おそらく喜んでいただけるでしょう(この質問に記載されているような問題が再び発生することはありません)。

http://www.miglayout.com/

MigLayout は、Java の将来のバージョンで JDK に含まれる可能性があります。

于 2013-06-25T16:01:39.993 に答える