边界和面板组织
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);
我很难处理边框,我查看了教程和示例,每个教程和示例似乎都使用了不同的样式,我只是想将内容组织到单独的边框中。底部面板的内容尚未完成,但我只是想在添加更多内容之前让它按原样工作。
编译器说有两行有问题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);