Как вы размещаете объекты в JPanel с BorderLayout? - PullRequest
3 голосов
/ 28 января 2010

У меня есть следующий класс, который реализует 3 JPanels. 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 должен отображаться первым сверху. Есть идеи? Я думаю, что позиция BorderLayout неверна.

Ответы [ 3 ]

1 голос
/ 28 января 2010

Кажется, проблема в этой строке:

frame.setExtendedState(JFrame.ICONIFIED);

По какой-то причине, если это будет выполнено до добавления компонентов в ваш фрейм, topPanel исчезнет.

Вы можете сделать одно из следующих действий:

  1. Забросьте весь ваш конструктор в блок try, с окончательно установленным расширенным состоянием.

  2. (рекомендуется) Установите расширенное состояние после того, как все было построено (с использованием другого метода или непосредственно в main). Вам также следует переместить такие вещи, как frame.setVisible(true);, в такой метод.

1 голос
/ 28 января 2010

Нет места для этих панелей, поэтому верхняя панель разделена примерно на 3 пикселя. Попробуйте

frame.setSize(800,800);

вместо.

0 голосов
/ 28 января 2010

Центральная панель съедает как можно больше доступного пространства . Если вы хотите, чтобы область прокрутки была «развернута» с помощью кнопок между верхней меткой и областью прокрутки, создайте еще одну JPanel с макетом границы, добавьте кнопки на север и панель прокрутки в центр и добавьте всю панель в центр ваш mainPanel

...