Java 与GridBagLayout不符的组件

Java 与GridBagLayout不符的组件,java,swing,jtable,jscrollpane,gridbaglayout,Java,Swing,Jtable,Jscrollpane,Gridbaglayout,我试图让GridBagLayout在一个框架中放置4个面板,在框架的每个象限中放置一个面板。我肯定我误解了布局管理器的一些基本内容,但我不确定是什么。以下是我的GUI代码: import java.awt.ScrollPane; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; impor

我试图让GridBagLayout在一个框架中放置4个面板,在框架的每个象限中放置一个面板。我肯定我误解了布局管理器的一些基本内容,但我不确定是什么。以下是我的GUI代码:

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中显示数据,但是标题不也应该出现吗


如果需要任何澄清,请告诉我,我会考虑其他有用的内容,并根据需要进行一些更新。

这里您将用表替换JScrollPane的ViewportView

listPanel.add( listTable );
取代

listPanel.setViewportView(listTable);

阅读:。

你真的希望有人能看穿这一团糟?您应该将面板划分为自包含的类,这样可以将每个面板中的混乱减少到与该面板相关的内容;然后可以分别测试每个面板布局。一旦你有了它,哪里出了问题就显而易见了。