简体   繁体   English

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

[英]How do you position objects in JPanel with BorderLayout?

I have the following class which implements 3 JPanels. 我有以下类实现3个JPanels。 1 Panel has a label, next are the buttons and the third is a table as described in my code: 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);
}

}

When I compile this, it displays the buttonPanel on top, a space, and then the scrollPane below it, leaving out the label where topPanel is supposed to display first at the top. 当我编译它时,它会在顶部显示一个buttonPanel,一个空格,然后在它下方显示scrollPane,省去topPanel应首先显示在顶部的标签。 Any ideas? 有任何想法吗? I'm thinking the BorderLayout position is wrong. 我认为BorderLayout的位置是错误的。

There isn't room for those panels so the top panel is squished into about 3 pixels. 这些面板没有空间,因此顶部面板被压缩成约3个像素。 Try 尝试

frame.setSize(800,800);

instead. 代替。

The problem seems to be this line: 问题似乎是这一行:

frame.setExtendedState(JFrame.ICONIFIED);

For some reason, if this is run before the components are added to your frame, topPanel will disappear. 出于某种原因,如果在将组件添加到框架之前运行,则topPanel将消失。

You can do one of these: 您可以执行以下操作之一:

  1. Chuck your entire constructor in a try block, with the extended state being set in finally. 将整个构造函数放入try块中,最后设置扩展状态。

  2. (recommended) Set the extended state after everything has been constructed (using another method or directly in main). (推荐)在构造完所有内容后设置扩展状态(使用其他方法或直接在main中)。 You should also move things like frame.setVisible(true); 你还应该移动像frame.setVisible(true); to such a method as well. 这样的方法也是如此。

Center panel will eat as much of the available space as possible . 中心面板将尽可能多地占用可用空间 If you want to have a scroll pane "maximized" with buttons between the top label and the scroll pane, create another JPanel with border layout, add buttons to the north and scroll pane to the center, and add the whole panel to the center of your mainPanel 如果要使用顶部标签和滚动窗格之间的按钮“最大化”滚动窗格,请创建另一个带边框布局的JPanel,向北添加按钮并将窗格滚动到中心,然后将整个面板添加到中心你的主mainPanel

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM