如何将主Java类转换为构造函数



我很难理解如何在Java中将应用程序转换为可调用类,反之亦然。比方说我写了一个tabe,它可以正确地作为主类使用。它生成带有一个面板的框架(窗口),该面板是一个表。如果我错了,请纠正我。

    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    public class DisplayPanel {
      public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Object rowData[][] = { { "Row1-Column1", "Row1-Column2", "Row1-Column3" },
            { "Row2-Column1", "Row2-Column2", "Row2-Column3" } };
        Object columnNames[] = { "Column One", "Column Two", "Column Three" };
        JTable table = new JTable(rowData, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 150);
        frame.setVisible(true);
      }
    }

我有个电话JPanel p=新的DisplayPanel();

这应该只是返回一个面板,由上面的代码生成。那么,我如何更改代码,使其具有可调用的DisplayPanel()类,该类返回Jpanel?这个转换的名字是什么(这样我就可以在谷歌上搜索了)?


让我重新表述一下这个问题。我有两个独立的项目:一个是sandBox(上面显示的是main,按预期工作),另一个是largeProject,它应该调用一个类(返回一个函数)并在largeProject自己的框架中显示它。我的大型项目有:

 JPanel p1 = new DisplayPanel1();
 add(p1, BorderLayout.NORTH);

我需要把它变成

 JPanel p1 = new DisplayPanel1(); //this one is implemented, but the panel is very diffeernt, hence not reusable
 JPanel p2 = new DisplayPanel2();
 add(p1, BorderLayout.NORTH);
 add(p2, BorderLayout.SOUTH); 

因此,转动DisplayPanel2();进入框架并没有真正的帮助。此外,仅仅帮助解决这个特定的问题不如解释一般原则有用。这种转换背后的逻辑是什么。

感谢您指出DisplayPanel和JPanel之间的区别。

您的DisplayPanel不应该创建JFrame并使其可见,而应该是JFrame

进行这种转换的一种方法是使类扩展JFrame,并将代码放入构造函数中,使用this而不是新的JFrame:

public class DisplayPanel extends JFrame {
  public DisplayPanel() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Object rowData[][] = { { "Row1-Column1", "Row1-Column2", "Row1-Column3" },
        { "Row2-Column1", "Row2-Column2", "Row2-Column3" } };
    Object columnNames[] = { "Column One", "Column Two", "Column Three" };
    JTable table = new JTable(rowData, columnNames);
    JScrollPane scrollPane = new JScrollPane(table);
    this.add(scrollPane, BorderLayout.CENTER);
    this.setSize(300, 150);
    // this.setVisible(true); this line should probably be called by the caller class now
  }
}

请注意,您也可以将列和行作为构造函数参数传递:

public class DisplayPanel extends JFrame {
  public DisplayPanel(Object[][] rowData, Object[] columnNames) {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTable table = new JTable(rowData, columnNames);
    JScrollPane scrollPane = new JScrollPane(table);
    this.add(scrollPane, BorderLayout.CENTER);
    this.setSize(300, 150);
    // this.setVisible(true); this line should probably be called by the caller class now
  }
}

我有一个调用JPanel p=new DisplayPanel();这应该只是返回一个面板,由上面的代码生成

实际上,不,它不返回面板,它试图创建一个DisplayPanel的实例作为JPanel,但它不能,因为DisplayPanel不是JPanel

如何更改代码,使其具有返回Jpanel的可调用DisplayPanel()类?

你可以把你的DisplayPanel变成JPanel

public class DisplayPanel extends JPanel { // <-- Note the 'extends'
    public DisplayPanel() {
        Object rowData[][] = { 
              { "Row1-Column1", "Row1-Column2", "Row1-Column3" },
              { "Row2-Column1", "Row2-Column2", "Row2-Column3" } };
        Object columnNames[] = { "Column One", "Column Two", "Column Three" };
        JTable table = new JTable(rowData, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane, BorderLayout.CENTER);
        // might have to set size on this...
    }
}

那么创建一个框架的Main类可能看起来是这样的

public class Main {
  public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
          public void run() {
              createAndShowGui();
          }
       });
  }
  public static void createAndShowGui() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    DisplayPanel p = new DisplayPanel(); <-- Use the "non-main" class here
    frame.add(p);
    // frame.setSize(300, 150); 
    frame.pack();
    frame.setVisible(true);
  }
}

相关内容

  • 没有找到相关文章

最新更新