如何使用BorderLayout在JPanel中定位对象?

3
我有一个类,实现了三个JPanels。第一个面板有一个标签,下一个是按钮,第三个是表格,如我的代码所述:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import java.util.*;
import javax.swing.event.*;

class  netTable implements ActionListener, TableModelListener
{
JFrame frame;
JTable table;
Vector rows,columns;
DefaultTableModel tabModel;
JScrollPane scrollPane;
JLabel lblMessage;
JButton cmdLookup, cmdUpdatePlan;
JPanel topPanel,mainPanel,buttonPanel;

public static void main(String[] args) 
    {
    netTable t=new netTable();
    }

netTable()
    {
    rows=new Vector();
    columns= new Vector();
    String[] columnNames = 
    { 
        "ID", 
        "Client",
        "Plan",
        "Amount"
    };

addColumns(columnNames);

tabModel=new DefaultTableModel();
tabModel.setDataVector(rows,columns);

table = new JTable(tabModel);
scrollPane= new JScrollPane(table);//ScrollPane

table.setRowSelectionAllowed(false);

table.getModel().addTableModelListener(this);

topPanel = new JPanel(); 
lblMessage=new JLabel("Invoices to Update"); 
topPanel.add(lblMessage); 

buttonPanel=new JPanel();

cmdLookup=new JButton("Lookup"); 
cmdUpdatePlan = new JButton("Update Plan");

buttonPanel.add(cmdLookup);
buttonPanel.add(cmdUpdatePlan);

cmdLookup.addActionListener(this);
cmdUpdatePlan.addActionListener(this);

mainPanel=new JPanel();
frame=new JFrame("Update Table");
frame.setSize(500,500);
frame.setExtendedState(JFrame.ICONIFIED);
mainPanel.setLayout(new BorderLayout());
mainPanel.add(topPanel,BorderLayout.NORTH);
mainPanel.add(buttonPanel,BorderLayout.CENTER);
mainPanel.add(scrollPane,BorderLayout.SOUTH);

topPanel.setBackground(Color.gray);
mainPanel.setBackground(Color.white);
buttonPanel.setBackground(Color.white);
table.getParent().setBackground(Color.black);
frame.getContentPane().add(mainPanel);
frame.addWindowListener(new WindowCloser());
frame.setVisible(true);
}

}

当我编译此代码时,它会在顶部显示buttonPanel,下面有一段空白,然后是scrollPane,而不是在顶部首先显示topPanel中的标签。您有什么想法吗?我认为这是边框布局的位置不正确所致。

“mainPanel.add(ScrollPane,BorderLayout.SOUTH);” 应该改为 “mainPanel.add(scrollPane,BorderLayout.SOUTH);” 吧? - user180100
是的,我的编辑器把它大写了..我会修复它的,谢谢。 - phill
3个回答

1

这些面板没有足够的空间,因此顶部面板被压缩到约3个像素。请尝试

frame.setSize(800,800);

而不是。


哦,好的。我怎么减小中间面板的大小? - phill
搞定了。我放弃了BorderLayout并切换到GridBagLayout。尽管它更复杂,但更加灵活。由于这个答案帮助我最多,所以我把分数给了这个答案。 - phill

1

问题似乎出在这一行:

frame.setExtendedState(JFrame.ICONIFIED);

由于某些原因,如果在组件添加到框架之前运行此代码,则 topPanel 将消失。

您可以执行以下操作之一:

  1. 将整个构造函数放入 try 块中,并在 finally 中设置扩展状态。

  2. (推荐) 在所有内容都已构建后(使用另一种方法或直接在 main 方法中),设置扩展状态。您还应该将诸如 frame.setVisible(true); 的内容移动到此类方法中。


0

中心面板将尽可能占用可用空间。如果您想要一个在顶部标签和滚动窗格之间有按钮的“最大化”滚动窗格,请创建另一个边框布局的JPanel,将按钮添加到北侧,将滚动窗格添加到中心,并将整个面板添加到mainPanel的中心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接