边界和面板组织

border and panel orginization

我很难处理边框,我查看了教程和示例,每个教程和示例似乎都使用了不同的样式,我只是想将内容组织到单独的边框中。底部面板的内容尚未完成,但我只是想在添加更多内容之前让它按原样工作。

编译器说有两行有问题java.lang.NullPointerException:

package question2;

import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

/**
 * @author Matt Headley
  This frame shows a data set and its statistics.
  */
 public class ComputerStoreGUI extends JFrame
 {  



   private JCheckBox item1;
   private JCheckBox item2;
   private JCheckBox item3;
   private JCheckBox item4;
   private JCheckBox item5;
   private TitledBorder border;
   private TitledBorder border2;
   private static JPanel content;
   private static JPanel top;
   private static JPanel bottom;
    private JTextField parts;

public ComputerStoreGUI()
 {       
  JCheckBox item1 = new JCheckBox("Install Hard Drive - .00");
  JCheckBox item2 = new JCheckBox("Install RAM - .00");
  JCheckBox item3 = new JCheckBox("Remove Virus - .00");
  JCheckBox item4 = new JCheckBox("Format Hard Drive - .00");
  JCheckBox item5 = new JCheckBox("Quote Hourly Labour - .00");
  item1.setHorizontalAlignment(JCheckBox.LEFT);
  item2.setHorizontalAlignment(JCheckBox.LEFT);
  item3.setHorizontalAlignment(JCheckBox.LEFT);
  item4.setHorizontalAlignment(JCheckBox.LEFT);
  item5.setHorizontalAlignment(JCheckBox.LEFT);
  JTextField cost = new JTextField(10);


  top = new JPanel(new FlowLayout(FlowLayout.LEFT));
  top.add(item1);
  top.add(item2);
  top.add(item3);
  top.add(item4);
  top.add(item5);
  bottom.add(cost); //here ????????
  cost.setHorizontalAlignment(JTextField.CENTER);


}



public static void main(String[] args)
{       
JFrame frame = new ComputerStoreGUI(); // and here ???????

content = new JPanel();
content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10,  10));

top = new JPanel();
top.setBorder(BorderFactory.createTitledBorder("Standard Services"));

bottom = new JPanel();
bottom.setBorder(BorderFactory.createTitledBorder("Hourly Service"));

    frame.setSize(250, 400);
    frame.setTitle("LU Computer Store");
    frame.setContentPane(content);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    content.add(top);
    content.add(bottom);
    frame.setVisible(true);
}

}

最终目标是看起来像这样:

首先,在您的示例中我没有看到扩展 JFrame 的共鸣。因此,如果没有继承,您可以使用如下组合:

JFrmae frame = new JFrame();

阅读更多:Why do we need to extend JFrame in a swing application?

The compiler says there are problems on two lines java.lang.NullPointerException:

原因是,您已经声明了 JPanel bottom 但没有初始化您正试图使用​​它,从这一行开始:bottom.add(cost);

做类似的事情:

bottom = new JPanel(new FlowLayout(FlowLayout.LEFT));
bottom.add(cost);

编辑:

comment: It runs now, but the panels are tiny

因为您需要为父面板设置布局 JPanel,您可以使用 BoxLayout,将子面板逐层添加,如下所示:

content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));

如果你想add space between those two child panels,使用如下:

content.add(top);
content.add(Box.createRigidArea(new Dimension(0,10)));
content.add(bottom);