每当我将面板的布局设置为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);
}
}
答案 0 :(得分:1)
不要使用null布局或使用setBounds()方法来定位和调整组件大小。
然而我的imageBackground和按钮放错了位置
背景是容器组件。也就是说,您将其创建为组件并将图像绘制为背景。然后将其他组件添加到后台组件。现在,图像将显示在背景中,其他组件将显示在其上方。
请参阅Background Panel以举例说明如何创建背景组件。
答案 1 :(得分:0)
可能的解决方案:我建议切换到Mig Layout作为所有java布局问题的解决方案。我现在将它用于我的应用程序中每个容器组件的布局。如果你转换,你可能会很高兴你做过(永远不会再出现这个问题中列出的问题)。
在未来的java版本中,MigLayout可能包含在JDK中。
答案 2 :(得分:0)
null布局意味着您必须明确放置所有组件。
我推荐BoxLayout。它非常简单,你可以放入垫片来在物体之间创造空间,并用胶水填充所有剩余的空间。
你也可以嵌套盒子。
如果你看一下java示例代码(并在源代码中查看); 他们嵌套了很多JPanel来获得复杂的布局。
答案 3 :(得分: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);
额外:尝试以上提示无效
setLayout(new FlowLayout(FlowLayout.LEFT,5,5))
;
创建两个面板;一个应该包含您的标签和按钮组件。 另一个应该包含包含您的表的JScrollPane。 两个面板都可以使用其布局来确定组件的布局方式。 您可以使用FlowLayout。
然后您可以将两个面板添加到母版面(JFrame)。