我創建了 3 個類(代碼如下)。
BasicDetails - 基類 - 此處創建的框架以及面板 GradeSubjectList - 派生類 - 此處創建的另一個面板并加載到在基類中創建的框架中 SubjectList - 派生類 - 此處創建的另一個面板并加載到在基類中創建的框架中
基類有一個自己的面板,點擊按鈕加載在 GradeSubjectList 中創建的面板。在此面板中創建的按鈕呼叫基類中的函式,該函式反過來將在 SubjectList 中創建的面板加載到在基類中創建的框架中。
在 BasicDetails 和 GradeSubjectList 中創建的面板加載有任何問題,并且在 SubjectList 中創建的面板在基類中創建的框架中加載時僅顯示在一個空白框架中
public class BasicDetails{
static int lec_no;
static int sub_no;
JFrame frame = new JFrame("Time Table");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
JPanel panel_bd = new JPanel();
public static void main(String[] args) {
BasicDetails bd = new BasicDetails();
bd.main_method_bd();
}
public void main_method_bd() {
panel_bd.setBackground(Color.white);
frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
panel_bd.setLayout(null);
JLabel lec_no_lbl = new JLabel("Enter the number of lectures required per day:");
JTextField lec_no_txt = new JTextField(5);
lec_no_txt.setText("5");
JButton next_btn_1 = new JButton("Next");
panel_bd.add(lec_no_lbl);
panel_bd.add(lec_no_txt);
panel_bd.add(next_btn_1);
lec_no_lbl.setBounds(5,100,300,20);
lec_no_txt.setBounds(320,100,50,20);
next_btn_1.setBounds(520,350,100,20);
next_btn_1.addActionListener(e->
{
lec_no=Integer.parseInt(lec_no_txt.getText());
panel_bd.setVisible(false);
gsl(); //calls function to load the next panel
});
frame.setSize(screenSize.width,screenSize.height);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(panel_bd);
}
//----this function loads the panel from GradeSubjectList.java
public void gsl() {
GradeSubjectList GSL = new GradeSubjectList();
JPanel gsl_panel = GSL.main_method_gsl();
frame.add(gsl_panel);
}
//-----this function loads the panel from SubjectList.java (this function gets called from GradeSubjectList.java but the panel does not load)
public void sl() {
SubjectList sl = new SubjectList();
JPanel sl_panel = sl.main_mehod_sl();
frame.add(sl_panel);
}
}
public class GradeSubjectList extends BasicDetails{
JComboBox grd_cb = new JComboBox();
JComboBox sub_cb_1 = new JComboBox();
public JPanel main_method_gsl() {
//-------Panel creation and loading components------------
JPanel panel_gsl = new JPanel();
panel_gsl.setBackground(Color.blue);
panel_gsl.setLayout(null);
JLabel tec_details_txt = new JLabel("Select the Grades and Subjects");
JButton next_btn_5 = new JButton("Next");
next_btn_5.setBounds(600,500,150,20);
tec_details_txt.setBounds(100,50,250,20);
grd_cb.setBounds(10,100,100,20);
sub_cb_1.setBounds(130,100,100,20);
panel_gsl.add(tec_details_txt);
panel_gsl.add(next_btn_5);
panel_gsl.add(grd_cb);
panel_gsl.add(sub_cb_1);
//On click perform actions
next_btn_5.addActionListener(e->
{
panel_gsl.setVisible(false);
sl(); //---------calls function in BasicDetails.java to load the next panel
});
return(panel_gsl); ////------returns panel to BasicDetails.java to load it in the frame
}
}
public class SubjectList extends BasicDetails{
public JPanel main_mehod_sl() {
//-------Panel creation and loading components------------
JPanel panel_sl = new JPanel();
panel_sl.setBackground(Color.white);
panel_sl.setLayout(null);
JLabel sub_list_lbl = new JLabel("Enter Subject Name");
JLabel max_day_lbl = new JLabel("Max Lectures Per Day");
JLabel max_week_lbl = new JLabel("Max Lectures Per Week");
sub_list_lbl.setBounds(25,50,150,20);
max_day_lbl.setBounds(200,50,150,20);
max_week_lbl.setBounds(375,50,150,20);
JButton next_btn_2 = new JButton("Next");
next_btn_2.setBounds(600,500,150,20);
JTextField sub_name_txt = new JTextField();
JTextField max_day_txt = new JTextField();
JTextField max_week_txt = new JTextField();
sub_name_txt.setBounds(25,100,150,20);
max_day_txt.setBounds(200,100,105,20);
max_week_txt.setBounds(375,100,150,20);
panel_sl.add(sub_list_lbl);
panel_sl.add(max_day_lbl);
panel_sl.add(max_week_lbl);
panel_sl.add(next_btn_2);
panel_sl.add(sub_name_txt);
panel_sl.add(max_day_txt);
panel_sl.add(max_week_txt);
//On click action
next_btn_2.addActionListener(e->
{
panel_sl.setVisible(false);
});
return(panel_sl); //------returns panel to BasicDetails.java to load it in the frame
}
}
我已經更改了從其他類加載面板的順序。我注意到首先加載的面板(從另一個類)加載沒有任何問題,而另一個面板則沒有。
例如,如果訂單是
- GradeSubjectList - 面板加載正確
- 主題串列 - 面板不顯示
并且是順序改變了
- 主題串列 - 面板正確加載
- GradeSubjectList - 面板不顯示
所以我的猜測是大部分代碼都運行良好......無法弄清楚哪里出了問題......
uj5u.com熱心網友回復:
序列中的第三個面板不可見的主要問題是因為它JFrame每次都被添加到一個新實體中。因為SubjectList從繼承BasicDetails(對于相同GradeSubjectList),并因為frame參考不是static,每一個新的BasicDetails物件(包括任何新實體GradeSubjectList和SubjectList)得到的一個新實體JFrame,其中序列(按相應的當在下一屏Next按鈕)被添加到該新的JFrame。
一種解決方案是使frame一個static參考和/或重新考慮你的類圖。
除此之外,請始終嘗試使用 a LayoutManager(而不是setLayout(null);)。在您的情況下, aCardLayout將在需要時處理在序列中設定 [in] 可見的每個面板的作業,這樣您就不必手動執行此操作。您還可以LayoutManager對添加到的每個面板使用 a frame(例如 a GridBagLayout)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/351821.html
