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

Java 如何使用BorderLayout在JPanel中定位对象?,java,jframe,jpanel,Java,Jframe,Jpanel,我有以下实现3个JPanel的类。1个面板有一个标签,下一个是按钮,第三个是表格,如我的代码所述: 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, TableModelList

我有以下实现3个JPanel的类。1个面板有一个标签,下一个是按钮,第三个是表格,如我的代码所述:

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应该首先在顶部显示的标签。有什么想法吗?我认为边界布局的位置是错误的

没有空间放置这些面板,因此顶部面板被压缩为3像素左右。试一试

frame.setSize(800,800);

相反。

问题似乎在于这一行:

frame.setExtendedState(JFrame.ICONIFIED);
出于某种原因,如果在将组件添加到框架之前运行此操作,则topPanel将消失

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

  • 在try块中丢弃整个构造函数,并最终设置扩展状态

  • (建议)在构建完所有内容后设置扩展状态(使用其他方法或直接在main中)。您还应该移动诸如
    frame.setVisible(true)之类的内容也适用于这种方法


  • 中央面板将显示。如果您希望在顶部标签和滚动窗格之间使用按钮“最大化”滚动窗格,请创建另一个带边框布局的JPanel,将按钮添加到北部,将滚动窗格添加到中部,并将整个面板添加到
    主面板的中央be
    主面板。添加(滚动窗格,BorderLayout.SOUTH)?是的,我的编辑把它大写了。。我会解决的,谢谢好的。。我该如何缩小中间面板的尺寸?我想好了。我刚刚取消了边界布局,改为GridBagLayout。虽然它更复杂,但它更灵活。因为这个答案对我帮助最大,所以我给这个答案打分。