Как получить экземпляр класса, который расширяет JPanel для отображения в других классах JPanel? - PullRequest
0 голосов
/ 08 февраля 2020

доходPanel отображается внутри IncomeAndSpendingPanel, но если я переместлю весь код доходаPanel в его собственный класс (как у меня с 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 TransactionsAdder = 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);



    }
}

1 Ответ

0 голосов
/ 08 февраля 2020

Скажу много здесь ... во-первых, вам, вероятно, нужно использовать JFrame, поэтому, пожалуйста, прочитайте о контейнерах верхнего уровня здесь .

Кроме того, поскольку вы используете наследование, вам определенно необходимо переместить все эти вызовы метода базового класса в метод и использовать конструктор только для инициализации переменных экземпляра. В противном случае у вас могут возникнуть всевозможные проблемы при создании любого объекта JPanel, потому что у вас есть перезаписываемые вызовы методов во время инициализации.

Однако, когда вы добавляете incomePanel и TransactionAdder

  1. Вы никогда не устанавливаете ни один из этих .setVisible(true)
  2. Вы никогда не устанавливаете IncomeAndSpendingPanel как .setVisible(true)
  3. Вы никогда не устанавливаете IncomeAndSpendingPanel на любой размер (используйте Dimension класс)
  4. Вы никогда не использовали контейнер иерархия

Пожалуйста go создайте содержимое, содержащееся в JFrame, и измените свой код, чтобы он выглядел как-то больше похоже на это:

class IncomeAndSpendingPanel extends JFrame
{
   //Instance variables

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

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