Я пытаюсь получить GridBagLayout
, чтобы разместить 4 панели в кадре, по одной панели в каждом квадранте кадра. Я уверен, что я неправильно понимаю что-то основное с менеджером макетов, но я не уверен, что. Вот код, который я для моего GUI:Компоненты, не предназначенные для GridBagLayout
import java.awt.ScrollPane;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Insets;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import javax.swing.border.*;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
/**
* GUI to interact with BookList
*/
public class GUI extends JPanel implements ActionListener
{
//// Main Panel ////
////////////////////
private JPanel mainPanel;
//// Border ////
////////////////
private Border loweredBorder;
//// Input Panel ////
/////////////////////
private JPanel inputPanel;
private JLabel titleLabel;
private JTextField titleField;
private JLabel authorLabel;
private JTextField authorField;
private JLabel genreLabel;
private JTextField genreField;
private JLabel priceLabel;
private JTextField priceField;
private JLabel reviewLabel;
private JTextField reviewField;
private JButton addBookButton;
//// Search Panel ////
//////////////////////
private JPanel searchPanel;
private JLabel searchLabel;
private JTextField searchField;
private JButton searchButton;
//// Output Panel ////
//////////////////////
private JPanel outputPanel;
private JLabel titleDisplayLabel;
private JLabel titleOutputLabel;
private JLabel authorDisplayLabel;
private JLabel authorOutputLabel;
private JLabel genreDisplayLabel;
private JLabel genreOutputLabel;
private JLabel priceDisplayLabel;
private JLabel priceOutputLabel;
private JLabel reviewDisplayLabel;
private JLabel reviewOutputLabel;
private JButton editBookButton;
private JButton deleteBookButton;
//// Display Panel ////
//////////////////////////
private JPanel displayPanel;
private JScrollPane listPanel;
private JButton displayButton;
//// BookList ////
//////////////////
private BookList bl;
/**
* Inputs and buttons for interacting with BookList
*/
public GUI()
{
// Instantiate a BookList
// TODO: Make BookList length a parameter
bl = new BookList(5);
loweredBorder = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
//// Instantiate and configure Main Panel ////
////////////////////////////////////////////////
GridBagLayout mainPanelLayout = new GridBagLayout();
this.setLayout(mainPanelLayout);
//// Instantiate and configure Input Panel ////
///////////////////////////////////////////////
inputPanel = new JPanel();
GridBagLayout inputPanelGridBag = new GridBagLayout();
GridBagConstraints inputPanelCons = new GridBagConstraints();
inputPanelCons.gridx = 0;
inputPanelCons.gridy = 0;
inputPanelCons.gridheight = 6;
inputPanelCons.gridwidth = 2;
inputPanelCons.weightx = 0.25;
inputPanelCons.weighty = 0.25;
inputPanelCons.ipadx = 10;
inputPanelCons.ipady = 10;
inputPanelCons.anchor = GridBagConstraints.FIRST_LINE_START;
inputPanelCons.fill = GridBagConstraints.BOTH;
inputPanelCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(inputPanel, inputPanelCons);
inputPanel.setBorder(
BorderFactory.createTitledBorder(loweredBorder,
"Add/Edit Book"));
inputPanel.setLayout(inputPanelGridBag);
// Title Input Label
titleLabel = new JLabel("Title:", JLabel.TRAILING);
GridBagConstraints titleLabelCons = new GridBagConstraints();
titleLabelCons.gridx = 0;
titleLabelCons.gridy = 0;
titleLabelCons.ipadx = 10;
titleLabelCons.ipady = 10;
titleLabelCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(titleLabel, titleLabelCons);
inputPanel.add(titleLabel);
// Title Input Field
titleField = new JTextField(16);
titleLabel.setLabelFor(titleField);
GridBagConstraints titleFieldCons = new GridBagConstraints();
titleFieldCons.gridx = 1;
titleFieldCons.gridy = 0;
titleFieldCons.ipadx = 10;
titleFieldCons.ipady = 10;
titleFieldCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(titleField, titleFieldCons);
inputPanel.add(titleField);
// Author Input Label
authorLabel = new JLabel("Author:", JLabel.TRAILING);
GridBagConstraints authorLabelCons = new GridBagConstraints();
authorLabelCons.gridx = 0;
authorLabelCons.gridy = 1;
authorLabelCons.ipadx = 10;
authorLabelCons.ipady = 10;
authorLabelCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(authorLabel, authorLabelCons);
inputPanel.add(authorLabel);
// Author Input Field
authorField = new JTextField(16);
GridBagConstraints authorFieldCons = new GridBagConstraints();
authorFieldCons.gridx = 1;
authorFieldCons.gridy = 1;
authorFieldCons.ipadx = 10;
authorFieldCons.ipady = 10;
authorFieldCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(authorField, authorFieldCons);
authorLabel.setLabelFor(authorField);
inputPanel.add(authorField);
// Genre Input Label
genreLabel = new JLabel("Genre:", JLabel.TRAILING);
GridBagConstraints genreLabelCons = new GridBagConstraints();
genreLabelCons.gridx = 0;
genreLabelCons.gridy = 2;
genreLabelCons.ipadx = 10;
genreLabelCons.ipady = 10;
genreLabelCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(genreLabel, genreLabelCons);
inputPanel.add(genreLabel);
// Genre Input Field
genreField = new JTextField(16);
GridBagConstraints genreFieldCons = new GridBagConstraints();
genreFieldCons.gridx = 1;
genreFieldCons.gridy = 2;
genreFieldCons.ipadx = 10;
genreFieldCons.ipady = 10;
genreFieldCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(genreField, genreFieldCons);
genreLabel.setLabelFor(genreField);
inputPanel.add(genreField);
// Price Input Label
priceLabel = new JLabel("Price:", JLabel.TRAILING);
GridBagConstraints priceLabelCons = new GridBagConstraints();
priceLabelCons.gridx = 0;
priceLabelCons.gridy = 3;
priceLabelCons.ipadx = 10;
priceLabelCons.ipady = 10;
priceLabelCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(priceLabel, priceLabelCons);
inputPanel.add(priceLabel);
// Price Input Field
priceField = new JTextField(16);
GridBagConstraints priceFieldCons = new GridBagConstraints();
priceFieldCons.gridx = 1;
priceFieldCons.gridy = 3;
priceFieldCons.ipadx = 10;
priceFieldCons.ipady = 10;
priceFieldCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(priceField, priceFieldCons);
priceLabel.setLabelFor(priceField);
inputPanel.add(priceField);
// Review Input Label
reviewLabel = new JLabel("Review:", JLabel.TRAILING);
GridBagConstraints reviewLabelCons = new GridBagConstraints();
reviewLabelCons.gridx = 0;
reviewLabelCons.gridy = 4;
reviewLabelCons.ipadx = 10;
reviewLabelCons.ipady = 10;
reviewLabelCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(reviewLabel, reviewLabelCons);
inputPanel.add(reviewLabel);
// Review Input Field
reviewField = new JTextField(16);
GridBagConstraints reviewFieldCons = new GridBagConstraints();
reviewFieldCons.gridx = 1;
reviewFieldCons.gridy = 4;
reviewFieldCons.ipadx = 10;
reviewFieldCons.ipady = 10;
reviewFieldCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(reviewField, reviewFieldCons);
reviewLabel.setLabelFor(reviewField);
inputPanel.add(reviewField);
// Add Book Button
addBookButton = new JButton("Add");
GridBagConstraints addBookButtonCons = new GridBagConstraints();
addBookButtonCons.gridx = 1;
addBookButtonCons.gridy = 5;
addBookButtonCons.ipadx = 10;
addBookButtonCons.ipady = 10;
addBookButtonCons.insets = new Insets(5, 5, 5, 5);
inputPanelGridBag.setConstraints(addBookButton, addBookButtonCons);
inputPanel.add(addBookButton);
// Add Book Button Event Listener
addBookButton.addActionListener(this);
// Add `inputPanel` to `mainPanel`
this.add(inputPanel);
//// List Panel instantiation and configuration ////
/////////////////////////////////////////////////////
displayPanel = new JPanel();
GridBagLayout displayPanelGridBag = new GridBagLayout();
GridBagConstraints displayPanelCons = new GridBagConstraints();
displayPanelCons.gridx = 0;
displayPanelCons.gridy = 1;
displayPanelCons.gridheight = 2;
displayPanelCons.gridwidth = 1;
displayPanelCons.weightx = 0.25;
displayPanelCons.weighty = 0.25;
displayPanelCons.ipadx = 10;
displayPanelCons.ipady = 10;
displayPanelCons.anchor = GridBagConstraints.LAST_LINE_START;
displayPanelCons.fill = GridBagConstraints.BOTH;
displayPanelCons.insets = new Insets(5, 5, 5, 5);
displayPanelGridBag.setConstraints(displayPanel, displayPanelCons);
displayPanel.setBorder(
BorderFactory.createTitledBorder(loweredBorder,
"Book List"));
displayPanel.setLayout(displayPanelGridBag);
// Separate panel for ScrollPane
listPanel = new JScrollPane();
GridBagConstraints listPanelCons = new GridBagConstraints();
listPanelCons.gridx = 0;
listPanelCons.gridy = 0;
listPanelCons.ipadx = 10;
listPanelCons.ipady = 10;
listPanelCons.fill = GridBagConstraints.BOTH;
listPanelCons.insets = new Insets(5, 5, 5, 5);
displayPanelGridBag.setConstraints(listPanel, listPanelCons);
JTable listTable = new JTable();
listTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
String[] colHeaders = { "Title", "Author", "Genre", "Price", "Review" };
listTable.setModel(
new DefaultTableModel(colHeaders, 0)
{
boolean[] colEditables = { false,
false,
false,
false,
false };
public boolean isCellEditable(int row, int col)
{
return colEditables[ col ];
}
});
listPanel.add(listTable);
displayPanel.add(listPanel);
displayButton = new JButton("Display");
GridBagConstraints displayButtonCons = new GridBagConstraints();
displayButtonCons.gridx = 0;
displayButtonCons.gridy = 1;
displayButtonCons.ipadx = 10;
displayButtonCons.ipady = 10;
displayButtonCons.insets = new Insets(5, 5, 5, 5);
displayPanelGridBag.setConstraints(displayButton, displayButtonCons);
displayButton.addActionListener(this);
displayPanel.add(displayButton);
this.add(displayPanel);
//// Search Panel instantiation and configuration ////
//////////////////////////////////////////////////////
searchPanel = new JPanel();
GridBagLayout searchPanelGridBag = new GridBagLayout();
GridBagConstraints searchPanelCons = new GridBagConstraints();
searchPanelCons.gridheight = 2;
searchPanelCons.gridwidth = 2;
searchPanelCons.weightx = 0.25;
searchPanelCons.weighty = 0.25;
searchPanelCons.gridx = 1;
searchPanelCons.gridy = 0;
searchPanelCons.ipadx = 10;
searchPanelCons.ipady = 10;
searchPanelCons.anchor = GridBagConstraints.FIRST_LINE_END;
searchPanelCons.fill = GridBagConstraints.BOTH;
searchPanelCons.insets = new Insets(5, 5, 5, 5);
searchPanelGridBag.setConstraints(searchPanel, searchPanelCons);
searchPanel.setBorder(
BorderFactory.createTitledBorder(loweredBorder,
"Search for Book"));
searchPanel.setLayout(searchPanelGridBag);
// Search Input Label
searchLabel = new JLabel("Search:", JLabel.TRAILING);
GridBagConstraints searchLabelCons = new GridBagConstraints();
searchLabelCons.gridx = 0;
searchLabelCons.gridy = 0;
searchLabelCons.ipadx = 10;
searchLabelCons.ipady = 10;
searchLabelCons.insets = new Insets(5, 5, 5, 5);
searchPanelGridBag.setConstraints(searchLabel, searchLabelCons);
searchPanel.add(searchLabel);
// Search Input Field
searchField = new JTextField(16);
searchLabel.setLabelFor(searchField);
GridBagConstraints searchFieldCons = new GridBagConstraints();
searchFieldCons.gridx = 1;
searchFieldCons.gridy = 0;
searchFieldCons.ipadx = 10;
searchFieldCons.ipady = 10;
searchFieldCons.insets = new Insets(5, 5, 5, 5);
searchPanelGridBag.setConstraints(searchField, searchFieldCons);
searchPanel.add(searchField);
// Search Button
searchButton = new JButton("Search");
searchButton.addActionListener(this);
GridBagConstraints searchButtonCons = new GridBagConstraints();
searchButtonCons.gridx = 1;
searchButtonCons.gridy = 1;
searchButtonCons.ipadx = 10;
searchButtonCons.ipady = 10;
searchFieldCons.insets = new Insets(5, 5, 5, 5);
searchPanelGridBag.setConstraints(searchButton, searchButtonCons);
searchPanel.add(searchButton);
this.add(searchPanel);
//// Output Panel instantiation and configuration ////
//////////////////////////////////////////////////////
outputPanel = new JPanel();
GridBagLayout outputPanelGridBag = new GridBagLayout();
GridBagConstraints outputPanelCons = new GridBagConstraints();
outputPanelCons.gridx = 1;
outputPanelCons.gridy = 1;
outputPanelCons.gridheight = 6;
outputPanelCons.gridwidth = 2;
outputPanelCons.weightx = 0.25;
outputPanelCons.weighty = 0.25;
outputPanelCons.ipadx = 10;
outputPanelCons.ipady = 10;
outputPanelCons.anchor = GridBagConstraints.LAST_LINE_END;
outputPanelCons.fill = GridBagConstraints.BOTH;
outputPanelCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(outputPanel, outputPanelCons);
outputPanel.setBorder(
BorderFactory.createTitledBorder(loweredBorder,
"Book Information"));
outputPanel.setLayout(outputPanelGridBag);
// Title Label
titleDisplayLabel = new JLabel("Title:", JLabel.TRAILING);
GridBagConstraints titleDisplayCons = new GridBagConstraints();
titleDisplayCons.gridx = 0;
titleDisplayCons.gridy = 0;
titleDisplayCons.ipadx = 10;
titleDisplayCons.ipady = 10;
titleDisplayCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(titleDisplayLabel, titleDisplayCons);
outputPanel.add(titleDisplayLabel);
// Title Output
titleOutputLabel = new JLabel("", JLabel.LEADING);
GridBagConstraints titleOutputCons = new GridBagConstraints();
titleOutputCons.gridx = 1;
titleOutputCons.gridy = 0;
titleOutputCons.ipadx = 10;
titleOutputCons.ipady = 10;
titleOutputCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(titleOutputLabel, titleOutputCons);
outputPanel.add(titleOutputLabel);
// Author Label
authorDisplayLabel = new JLabel("Author:", JLabel.TRAILING);
GridBagConstraints authorDisplayCons = new GridBagConstraints();
authorDisplayCons.gridx = 0;
authorDisplayCons.gridy = 1;
authorDisplayCons.ipadx = 10;
authorDisplayCons.ipady = 10;
authorDisplayCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(authorDisplayLabel, authorDisplayCons);
outputPanel.add(authorDisplayLabel);
// Author Output
authorOutputLabel = new JLabel("", JLabel.LEADING);
GridBagConstraints authorOutputCons = new GridBagConstraints();
authorOutputCons.gridx = 1;
authorOutputCons.gridy = 1;
authorOutputCons.ipadx = 10;
authorOutputCons.ipady = 10;
authorOutputCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(authorOutputLabel, authorOutputCons);
outputPanel.add(authorOutputLabel);
// Genre Label
genreDisplayLabel = new JLabel("Genre:", JLabel.TRAILING);
GridBagConstraints genreDisplayCons = new GridBagConstraints();
genreDisplayCons.gridx = 0;
genreDisplayCons.gridy = 2;
genreDisplayCons.ipadx = 10;
genreDisplayCons.ipady = 10;
genreDisplayCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(genreDisplayLabel, genreDisplayCons);
outputPanel.add(genreDisplayLabel);
// Genre Output
genreOutputLabel = new JLabel("", JLabel.LEADING);
GridBagConstraints genreOutputCons = new GridBagConstraints();
genreOutputCons.gridx = 1;
genreOutputCons.gridy = 2;
genreOutputCons.ipadx = 10;
genreOutputCons.ipady = 10;
genreOutputCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(genreOutputLabel, genreOutputCons);
outputPanel.add(genreOutputLabel);
// Price Label
priceDisplayLabel = new JLabel("Price:", JLabel.TRAILING);
GridBagConstraints priceDisplayCons = new GridBagConstraints();
priceDisplayCons.gridx = 0;
priceDisplayCons.gridy = 3;
priceDisplayCons.ipadx = 10;
priceDisplayCons.ipady = 10;
priceDisplayCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(priceDisplayLabel, priceDisplayCons);
outputPanel.add(priceDisplayLabel);
// Price Output
priceOutputLabel = new JLabel("", JLabel.LEADING);
GridBagConstraints priceOutputCons = new GridBagConstraints();
priceOutputCons.gridx = 1;
priceOutputCons.gridy = 3;
priceOutputCons.ipadx = 10;
priceOutputCons.ipady = 10;
priceOutputCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(priceOutputLabel, priceOutputCons);
outputPanel.add(priceOutputLabel);
// Review Label
reviewDisplayLabel = new JLabel("Review:", JLabel.TRAILING);
GridBagConstraints reviewDisplayCons = new GridBagConstraints();
reviewDisplayCons.gridx = 0;
reviewDisplayCons.gridy = 4;
reviewDisplayCons.ipadx = 10;
reviewDisplayCons.ipady = 10;
reviewDisplayCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(reviewDisplayLabel, reviewDisplayCons);
outputPanel.add(reviewDisplayLabel);
// Review Output
reviewOutputLabel = new JLabel("", JLabel.LEADING);
GridBagConstraints reviewOutputCons = new GridBagConstraints();
reviewOutputCons.gridx = 1;
reviewOutputCons.gridy = 4;
reviewOutputCons.ipadx = 10;
reviewOutputCons.ipady = 10;
reviewOutputCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(reviewOutputLabel, reviewOutputCons);
outputPanel.add(reviewOutputLabel);
// Edit Button
editBookButton = new JButton("Edit");
GridBagConstraints editButtonCons = new GridBagConstraints();
editButtonCons.gridx = 0;
editButtonCons.gridy = 5;
editButtonCons.ipadx = 10;
editButtonCons.ipady = 10;
editButtonCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(editBookButton, editButtonCons);
outputPanel.add(editBookButton);
editBookButton.addActionListener(this);
// Delete Button
deleteBookButton = new JButton("Delete");
GridBagConstraints deleteButtonCons = new GridBagConstraints();
deleteButtonCons.gridx = 1;
deleteButtonCons.gridy = 5;
deleteButtonCons.ipadx = 10;
deleteButtonCons.ipady = 10;
deleteButtonCons.insets = new Insets(5, 5, 5, 5);
outputPanelGridBag.setConstraints(deleteBookButton, deleteButtonCons);
outputPanel.add(deleteBookButton);
deleteBookButton.addActionListener(this);
this.add(outputPanel);
}
public void actionPerformed(ActionEvent e)
{
}
}
А вот как окно выглядит, когда я компиляции и запуска приложения:
Я знаю, что я ничего не имею крючковатый до отображения данных в JTable
в displayPanel
, но не должны появляться заголовки?
Если требуется какое-либо разъяснение, дайте мне знать, я буду думать о том, что еще может быть полезно и внести некоторые обновления по мере необходимости.
Вы, serioulsy, ожидаете, что кто-то просмотрит этот беспорядок? Вы должны разделить панели на самостоятельные классы - это уменьшит беспорядок в каждой панели до того, что связано с этой панелью; вы можете затем тестировать каждую панель отдельно. Его будет очевидно, когда он пойдет не так, как только получится. – Durandal