我很难理解如何在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);
}
}