2010-01-27 54 views
3

我有以下類實現3個JPanel。 1個面板具有一個標籤,接下來的是按鈕和第三個是如在我的代碼描述的表:如何使用BorderLayout在JPanel中定位對象?

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在上面,一個空間,然後滾動窗格它下面,而忽略topPanel應該首先顯示在頂部的標籤。有任何想法嗎?我在想BorderLayout的位置是錯誤的。

+0

不應該'mainPanel.add(ScrollPane,BorderLayout.SOUTH);'是'mainPanel.add(scrollPane,BorderLayout.SOUTH);'? – 2010-01-27 22:31:20

+0

是的,我的編輯器大寫了它..我會解決這個問題,謝謝 – phill 2010-01-27 22:35:16

回答

1

使頂部面板被壓扁成左右3像素沒有餘地那些板。嘗試

frame.setSize(800,800); 

改爲。

+0

哦好吧..我如何減少中間面板的大小? – phill 2010-01-27 22:51:14

+0

想通了。我剛剛取消了borderlayout並切換到了GridBagLayout。儘管它更復雜,但它更靈活。由於這個答案對我最有幫助,所以我給了這個答案的觀點。 – phill 2010-02-01 22:06:45

1

的問題似乎是這一行:

frame.setExtendedState(JFrame.ICONIFIED); 

出於某種原因,如果組件添加到您的框架在此之前運行,topPanel就會消失。在try塊

  1. 查你的整個構造,與被設置在伸展狀態終於:

    你可以做其中之一。

  2. (推薦)在構建完所有東西(使用其他方法或直接在main中)後設置擴展狀態。您還應該將諸如frame.setVisible(true);之類的東西也轉移到這種方法。

0

中心面板會eat as much of the available space as possible。如果您希望使用頂部標籤和滾動窗格之間的按鈕使「滾動窗格」最大化,請創建具有邊框佈局的另一個JPanel,在北部添加按鈕並將窗格滾動到中心,並將整個面板添加到中心您的mainPanel