Java 将另一个类的JPanel添加到主类的JPanel中
我有一个主类,它有两个面板,左面板和右面板。左侧面板已经有一些组件,右侧面板在北部有一个标签和一个按钮。我想将另一个类中的JPanel添加到主类的右面板中。到目前为止,我所做的是实例化该类并将其添加到rightPanel,但它似乎给了我错误。以下是我的主类代码:Java 将另一个类的JPanel添加到主类的JPanel中,java,swing,nullpointerexception,jframe,jpanel,Java,Swing,Nullpointerexception,Jframe,Jpanel,我有一个主类,它有两个面板,左面板和右面板。左侧面板已经有一些组件,右侧面板在北部有一个标签和一个按钮。我想将另一个类中的JPanel添加到主类的右面板中。到目前为止,我所做的是实例化该类并将其添加到rightPanel,但它似乎给了我错误。以下是我的主类代码: package project; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java
package project;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import nodeChooser.gristDatabaseUtilities.SetupParentPopulation;
import nodeChooser.internal.NodeChooser;
import nodeChooser.publicInterfaces.Enumerations;
import nodeChooser.publicInterfaces.Precondition;
import nodeChooser.publicInterfaces.SubmitButtonListener;
import nodeChooser.publicInterfaces.UserSelection;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import utilities.Utilities;
public class Main extends JPanel implements SubmitButtonListener{
private JPanel mainPanel;
private JPanel leftPanel;
private JPanel rightPanel;
private JPanel centerPanel;
private JPanel southPanel;
private JSplitPane splitPane;
private Document cat;
private Document qt;
public Main() {
mainPanel = new JPanel(new BorderLayout());
setupJpanels();
setupMainWindow();
cat = Utilities.buildXMLDocumentFromFile("cat-woking-age.xml");
qt = Utilities.buildXMLDocumentFromFile("qt-woking-age.xml");
// this is how we plug nodeChooser into our project
NodeChooser nodeChooser = new NodeChooser(this, leftPanel, cat, qt);
}
private void setupJpanels() {
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setContinuousLayout(true);
splitPane.setDividerLocation(560);
splitPane.setOneTouchExpandable(true);
leftPanel = new JPanel();
rightPanel = new JPanel(new BorderLayout());
splitPane.setTopComponent(leftPanel);
splitPane.setBottomComponent(rightPanel);
mainPanel.add(splitPane, BorderLayout.CENTER);
}
private void setupMainWindow() {
final JFrame frame= new JFrame("GRiST Project '13");
frame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(WindowEvent winEvt) {
System.exit(0);
}
public void windowOpened(WindowEvent e) {
//frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
});
frame.getContentPane().add(mainPanel);
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int width=600;
int height=400;
frame.setSize(width, height);
frame.setLocation((screenSize.width-width)/2,(screenSize.height-height)/2);
frame.setVisible(true);
}
/**
* this receives callbacks from nodeChooser
*/
@Override
public void submitClicked(final UserSelection userSelection) {
//the parameter userSelection has all the information that nodeChooser wants to pass on to us.
String query= "SELECT everything FROM mygrist_samples WHERE ";
JTextArea selectLabel= new JTextArea(query);
selectLabel.setLineWrap(true);
JPanel submitButtonPanel= new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton setSubmit= new JButton("Submit Query");
setSubmit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SetupParentPopulation parentpop= new SetupParentPopulation(userSelection);
JPanel setSplitPanel= new JPanel(new BorderLayout());
String rows= parentpop.getRowsInserted();
JLabel getInsertedRows= new JLabel(rows+" records found.", JLabel.LEFT);
setSplitPanel.add(getInsertedRows, BorderLayout.CENTER);
rightPanel.add(setSplitPanel);
**SplitMain splitMain= new SplitMain();
rightPanel.add(splitMain);**
}
});
submitButtonPanel.add(setSubmit);
rightPanel.add(selectLabel, BorderLayout.NORTH);
rightPanel.add(submitButtonPanel, BorderLayout.CENTER);
if (userSelection.getPreconditions().size() > 0) {
String getCorrespondingCodeFromDatabase;
for (int i = 0; i < userSelection.getPreconditions().size(); i++) {
getCorrespondingCodeFromDatabase = userSelection.getPreconditions().get(i).getCode();
getCorrespondingCodeFromDatabase = getCorrespondingCodeFromDatabase.replaceAll("-", "_");
Enumerations enum1= new Enumerations();
String getCorrespondingRelationship= enum1.getOperator(userSelection.getPreconditions().get(i).getRelationship());
query += getCorrespondingCodeFromDatabase + " " + getCorrespondingRelationship
+ " '" + userSelection.getPreconditions().get(i).getAnswer() + "'";
selectLabel.setText(query);
selectLabel.revalidate();
repaint();
if (i != userSelection.getPreconditions().size() - 1) {
query += " AND ";
}
}
} else {
System.out.println("No records found");
}
}
public static void main(String[] args) {
new Main();
}
}
成套工程;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.GridLayout;
导入java.awt.Label;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.AdjustmentEvent;
导入java.awt.event.AdjustmentListener;
导入java.awt.event.WindowEvent;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JScrollBar;
导入javax.swing.JScrollPane;
导入javax.swing.JSplitPane;
导入javax.swing.JTextArea;
导入nodeChooser.gristDatabaseUtilities.SetupParentPopulation;
导入nodeChooser.internal.nodeChooser;
导入nodeChooser.publicInterfaces.Enumerations;
导入nodeChooser.publicInterfaces.Premission;
导入nodeChooser.publicInterfaces.SubmitButtoListener;
导入nodeChooser.publicInterfaces.UserSelection;
导入org.w3c.dom.Document;
导入org.w3c.dom.NamedNodeMap;
导入实用程序。实用程序;
公共类Main扩展JPanel实现SubmitButtonListener{
私人JPanel主面板;
私人JPanel leftPanel;
私人JPanel rightPanel;
私人JPanel中心面板;
私人JPanel southPanel;
私有JSplitPane拆分窗格;
私人文件类别;
私人文件;
公用干管(){
mainPanel=newjpanel(newborderlayout());
setupJpanels();
setupMainWindow();
cat=Utilities.buildXMLDocumentFromFile(“cat woking age.xml”);
qt=Utilities.buildXMLDocumentFromFile(“qt woking age.xml”);
//这就是我们将nodeChooser插入到项目中的方式
NodeChooser NodeChooser=新的NodeChooser(此,左面板,cat,qt);
}
私有void setupJpanels(){
splitPane=新的JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setContinuousLayout(true);
splitPane.setDividerLocation(560);
splitPane.setOneTouchExpandable(true);
leftPanel=newjpanel();
rightPanel=newjpanel(newborderlayout());
splitPane.setTopComponent(左面板);
splitPane.setBottomComponent(右面板);
添加(拆分窗格,边框布局,中间);
}
私有void setupMainWindow(){
最终JFrame=新JFrame(“GRiST项目'13”);
frame.addWindowListener(新java.awt.event.WindowAdapter(){
公共无效窗口关闭(WindowEvent winEvt){
系统出口(0);
}
公共无效窗口已打开(WindowEvent e){
//setExtendedState(JFrame.MAXIMIZED_二者);
}
});
frame.getContentPane().add(主面板);
维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
整数宽度=600;
内部高度=400;
框架尺寸(宽度、高度);
帧。设置位置((屏幕大小。宽度)/2,(屏幕大小。高度)/2);
frame.setVisible(true);
}
/**
*这将接收来自nodeChooser的回调
*/
@凌驾
public void submitClicked(最终用户选择用户选择){
//参数userSelection包含nodeChooser想要传递给我们的所有信息。
String query=“从mygrist\u示例中选择所有内容”;
JTextArea selectLabel=新建JTextArea(查询);
选择label.setLineWrap(true);
JPanel submitButtonPanel=newjpanel(newflowlayout(FlowLayout.CENTER));
JButton setSubmit=新JButton(“提交查询”);
setSubmit.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
SetupParentPopulation parentpop=新的SetupParentPopulation(用户选择);
JPanel setSplitPanel=新的JPanel(新的BorderLayout());
String rows=parentpop.getRowsInserted();
JLabel getInsertedRows=新的JLabel(行+找到的记录),JLabel.LEFT;
setSplitPanel.add(getInsertedRows,BorderLayout.CENTER);
右面板。添加(setSplitPanel);
**SplitMain SplitMain=新的SplitMain();
右面板。添加(splitMain)**
}
});
submitButtonPanel.add(setSubmit);
右面板。添加(选择Label,BorderLayout.NORTH);
添加(submitButtonPanel,BorderLayout.CENTER);
if(userSelection.getPremissions().size()>0){
从数据库获取对应代码的字符串;
对于(int i=0;i package project;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import nodeChooser.gristDatabaseUtilities.SetupSubsamplePopulation;
import nodeChooser.publicInterfaces.Enumerations;
import nodeChooser.publicInterfaces.SplitSubmitButtonListener;
import nodeChooser.publicInterfaces.UserSelectedSplit;
import org.w3c.dom.Document;
import utilities.Utilities;
import conditions.splitUtilities.SplitChooser;
public class SplitMain extends JPanel implements SplitSubmitButtonListener{
private JPanel mainPanel;
private JPanel leftPanel;
private JPanel rightPanel;
private JPanel centerPanel;
private JPanel southPanel;
private JSplitPane splitPane;
private Document cat;
private Document qt;
public SplitMain() {
rightPanel = new JPanel(new BorderLayout());
cat = Utilities.buildXMLDocumentFromFile("cat-woking-age.xml");
qt = Utilities.buildXMLDocumentFromFile("qt-woking-age.xml");
// this is how we plug splitChooser into our project
SplitChooser splitChooser = new SplitChooser(this, rightPanel, cat, qt);
}
@Override
public void submitSplitClicked(final UserSelectedSplit userSplitSelection) {
String query= "SELECT everything FROM mygrist_samples WHERE ";
JTextArea selectLabel= new JTextArea(query);
selectLabel.setLineWrap(true);
JPanel submitButtonPanel= new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton setSubmit= new JButton("Submit Query");
setSubmit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SetupSubsamplePopulation parentpop= new SetupSubsamplePopulation(userSplitSelection);
JPanel setSplitPanel= new JPanel(new BorderLayout());
String rows= parentpop.getRows();
JLabel getInsertedRows= new JLabel(rows+" records found.", JLabel.LEFT);
setSplitPanel.add(getInsertedRows, BorderLayout.NORTH);
getInsertedRows.revalidate();
getInsertedRows.repaint();
rightPanel.add(setSplitPanel, BorderLayout.CENTER);
}
});
submitButtonPanel.add(setSubmit);
rightPanel.add(selectLabel, BorderLayout.NORTH);
rightPanel.add(submitButtonPanel, BorderLayout.CENTER);
if (userSplitSelection.getSplitConditions().size() > 0) {
String getCorrespondingCodeFromDatabase;
for (int i = 0; i < userSplitSelection.getSplitConditions().size(); i++) {
getCorrespondingCodeFromDatabase = userSplitSelection.getSplitConditions().get(i).getCode();
getCorrespondingCodeFromDatabase = getCorrespondingCodeFromDatabase.replaceAll("-", "_");
Enumerations enum1= new Enumerations();
String getCorrespondingRelationship= enum1.getOperator(userSplitSelection.getSplitConditions().get(i).getRelationship());
query += getCorrespondingCodeFromDatabase + " " + getCorrespondingRelationship
+ " '" + userSplitSelection.getSplitConditions().get(i).getAnswer() + "'";
selectLabel.setText(query);
selectLabel.revalidate();
repaint();
if (i != userSplitSelection.getSplitConditions().size() - 1) {
query += " AND ";
}
}
} else {
System.out.println("No records found");
}
}
}
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at conditions.splitUtilities.SplitChooser.<init>(SplitChooser.java:133)
at project.SplitMain.<init>(SplitMain.java:49)
at project.Main$2.actionPerformed(Main.java:145)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
package conditions.splitUtilities;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import nodeChooser.internal.IconSource;
import nodeChooser.internal.SplitConditionChangeListener;
import nodeChooser.publicInterfaces.Enumerations.QuestionType;
import nodeChooser.publicInterfaces.Enumerations.Relationship;
import nodeChooser.publicInterfaces.SplitSubmitButtonListener;
import nodeChooser.publicInterfaces.UserSelectedSplit;
import nodeChooser.publicInterfaces.UserSplit;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class SplitChooser implements SplitConditionChangeListener {
private JPanel mainPanel;
private JPanel centerpanelWrapper;
private Document qt;
private Document cat;
private ArrayList<SplitConditionGui> splitConditions;
/**
*
* @param submitButtonListener a class that implements this interface so that we can notify them when submit button has been clicked
* @param panel the JPanel on which the node chooser would be painted
* @param cat the cat xml
* @param qt the qt xml
*/
public SplitChooser(final SplitSubmitButtonListener splitSubmitButtonListener, JPanel panel, Document cat, Document qt) {
this.qt = qt;
this.cat = cat;
splitConditions = new ArrayList<SplitConditionGui>();
centerpanelWrapper = panel;
mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
addSplitCondition();
JPanel northPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton addButton = new JButton("Add Precondition");
addButton.setIcon(IconSource.createImageIcon("images2/add.png"));
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addSplitCondition();
}
});
northPanel.add(addButton);
JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton queryButton = new JButton("Submit");
queryButton.setIcon(IconSource.createImageIcon("images2/accept.png"));
queryButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
splitSubmitButtonListener.submitSplitClicked(new UserSelectedSplit() {
@Override
public ArrayList<UserSplit> getSplitConditions() {
ArrayList<UserSplit> splitConditionList = new ArrayList<>();
for(final SplitConditionGui splitList: splitConditions) {
if(splitList.getNodeCode() == null)
continue;
splitConditionList.add(new UserSplit() {
@Override
public boolean isLeafNode() {
return splitList.isLeaf();
}
@Override
public Node getSelectedCatNode() {
return splitList.getCatNode();
}
@Override
public Relationship getRelationship() {
return splitList.getRelationship();
}
@Override
public Node getQTNode() {
return splitList.getQtNode();
}
@Override
public QuestionType getNodeType() {
return splitList.getQuestionType(splitList.getQtNode());
}
@Override
public String getCode() {
return splitList.getNodeCode();
}
@Override
public String getAnswer() {
return splitList.getAnswer();
}
});
}
return splitConditionList;
}
});
}
});
southPanel.add(queryButton);
JScrollPane jsp = new JScrollPane(mainPanel);
jsp.setBorder(null);
//this part gives nullPointerException and I don't know why it's passing null. Seems to be working fine for other classes
centerpanelWrapper.removeAll();
centerpanelWrapper.setLayout(new BorderLayout(10,5));
centerpanelWrapper.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5), BorderFactory.createTitledBorder("Preconditions")));
centerpanelWrapper.add(jsp, BorderLayout.CENTER);
centerpanelWrapper.add(northPanel, BorderLayout.NORTH);
centerpanelWrapper.add(southPanel, BorderLayout.SOUTH);
centerpanelWrapper.revalidate();
centerpanelWrapper.repaint();
}
private void addSplitCondition() {
SplitConditionGui splitConditionGui = new SplitConditionGui(this, cat, qt);
splitConditions.add(splitConditionGui);
mainPanel.add(splitConditionGui.getJpanel());
mainPanel.revalidate();
mainPanel.repaint();
}
private void removeSplitCondition(SplitConditionGui splitConditionGui) {
splitConditions.remove(splitConditionGui);
mainPanel.remove(splitConditionGui.getJpanel());
mainPanel.revalidate();
mainPanel.repaint();
}
@Override
public void removedCondition(SplitConditionGui splitConditionGui) {
removeSplitCondition(splitConditionGui);
}
}