簡體   English   中英

如何獲取擴展 JPanel 以顯示在另一個 JPanel 類中的類的實例?

[英]How do I get an instance of a class that extends a JPanel to display in another classes JPanel?

收入面板顯示在 IncomeAndSpendingPanel 內,但如果我將所有收入面板代碼移動到它自己的類中(就像我使用 SpendingPanel 和 TransactionAdder 一樣)並嘗試將它們添加到 IncomeAndSpendingPanel 中,這樣就不會顯示任何內容。 我只是想清理我的代碼並將其分成不同的部分。

public class IncomeAndSpendingPanel extends JPanel {

    private ColorX cx = new ColorX();
    DefaultTableModel incomeTableModel;
    DefaultTableModel spendingTableModel;


    private String[] incomeColumnHeadings = {"Date","Description","Amount"};
    private String[] spendingColumnHeadings = {"Date","Description","Amount","Category"};

    Border empty = BorderFactory.createEmptyBorder(10, 10, 10, 10);
    Border blackLine = BorderFactory.createLineBorder(Color.black);
    CompoundBorder line = new CompoundBorder(empty, blackLine);

    public IncomeAndSpendingPanel() {

        setLayout(new BorderLayout());
        add(new TransactionAdder(), BorderLayout.NORTH);
        add(new SpendingPanel(), BorderLayout.EAST);


        JPanel incomePanel;
        Border incomePanelBorder = BorderFactory.createTitledBorder(line, "INCOME");
        JTable incomeTransactionInputTable;


        incomePanel = new JPanel(new GridLayout());

        incomePanel.setBorder(incomePanelBorder);

        incomeTableModel = new DefaultTableModel(50, incomeColumnHeadings.length);
        incomeTableModel.setColumnIdentifiers(incomeColumnHeadings);

        incomeTransactionInputTable = new JTable(incomeTableModel);
        incomeTransactionInputTable.getColumnModel().getColumn(0).setPreferredWidth(1);
        incomeTransactionInputTable.getColumnModel().getColumn(1).setPreferredWidth(200);
        incomeTransactionInputTable.getColumnModel().getColumn(2).setPreferredWidth(10);

        incomePanel.add(new JScrollPane(incomeTransactionInputTable));

        add(incomePanel, BorderLayout.CENTER);
    }

這是我為 TransactionAdder 構建的類,當我嘗試將它添加到 IncomeAndSpendingPanel 時沒有任何顯示,我嘗試創建一個 TransactionAdder transactionAdder = new TransactionAdder(); 然后像這樣添加 TransactionAdder 的實例

add(transactionAdder, BorderLayout.NORTH);

但是 IncomeAndSpendingPanel 上也沒有任何顯示

public class TransactionAdder extends JPanel {

    DefaultTableModel model3;
    DefaultTableModel model4;

    private String[] incomeColumnHeadings = {"Date","Description","Amount"};
    private String[] spendingColumnHeadings = {"Date","Description","Amount","Category"};

    Border empty = BorderFactory.createEmptyBorder(10, 10, 10, 10);
    Border blackLine = BorderFactory.createLineBorder(Color.black);
    CompoundBorder line = new CompoundBorder(empty, blackLine);

    JTable incomeTransactionTable;
    JTable spendingTransactionTable;
    JPanel transactionAdderPanel;
    Border transactionAdderPanelBorder = BorderFactory.createTitledBorder(line, "ADD TRANSACTION");
    JScrollPane jScrollPane;
    JScrollPane jScrollPane1;

    public TransactionAdder() {

        transactionAdderPanel = new JPanel(new GridLayout());

        transactionAdderPanel.setBorder(transactionAdderPanelBorder);

        model3 = new DefaultTableModel(1, incomeColumnHeadings.length);
        model3.setColumnIdentifiers(incomeColumnHeadings);
        model4 = new DefaultTableModel(1, spendingColumnHeadings.length);
        model4.setColumnIdentifiers(spendingColumnHeadings);

        transactionAdderPanel.add(new JButton("Add New Income"));

        incomeTransactionTable = new JTable(model3);
        jScrollPane = new JScrollPane(incomeTransactionTable);
        jScrollPane.setPreferredSize(new Dimension(300, 38));
        transactionAdderPanel.add(jScrollPane);

        transactionAdderPanel.add(new JButton("Add New Spending"));

        spendingTransactionTable = new JTable(model4);
        jScrollPane1 = new JScrollPane(spendingTransactionTable);
        jScrollPane1.setPreferredSize(new Dimension(300, 38));
        transactionAdderPanel.add(jScrollPane1);



    }
}

這里有很多話要說……首先,您可能需要使用 JFrame,因此請在此處閱讀有關頂級容器的信息

此外,由於您使用的是繼承,因此您肯定需要將所有這些基類方法調用移動到一個方法中,並且僅使用構造函數來初始化實例變量。 如果不這樣做,則在創建任何 JPanel 對象時可能會遇到各種問題,因為在初始化期間您有可覆蓋的方法調用。

但是,當您添加incomePanelTransactionAdder

  1. 你從來沒有設置這些.setVisible(true)
  2. 你永遠不會將你的IncomeAndSpendingPanel設置為.setVisible(true)
  3. 您永遠不會將IncomeAndSpendingPanel設置為任何大小(使用Dimension類)
  4. 您從未使用過容器層次結構

請讓那些包含在 JFrame 中並更改您的代碼以使其看起來更像這樣:

class IncomeAndSpendingPanel extends JFrame
{
   //Instance variables

   public IncomeAndSpendingPanel()
   {
     //initialize instance variables
     createAndShowGui();
   }

   private void createAndShowGui()
   {
     //Your code
     this.setVisible(true);
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM