将扩展 JFrame 的 class 更改为扩展 JPanel 的 class

Change class that extends JFrame to class that extends JPanel

我是一个 Java-新手,我正在尝试构建我的第一个应用程序。我阅读了很多教程和演示,并搜索了我问题的具体答案,但没有找到有用的东西。 为了测试,我写了这个 class,它将访问数据库与 JTable 连接起来。现在我想在主应用程序中添加这个 Class 但因此我必须将现有的 class 更改为 JPanel。我测试了一些更改,但我的应用程序中不再有输出 JTable。任何人都可以解释我必须更改 class 的方式吗?非常感谢!

    package de.test.gui;

import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

class Projekt {
    private int Platz;
    private String ProjektName;
    private String StimmZahl;

    public Projekt(int platz, String projektName, String stimmZahl) {
        this.Platz = platz;
        this.ProjektName = projektName;
        this.StimmZahl = stimmZahl;
    }

    public int getPlatz(){
        return this.Platz;
    }

    public String getProjektName() {
        return this.ProjektName;
    }

    public String getStimmZahl(){
        return this.StimmZahl;
    }

}
public class TabelleProjekt extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public TabelleProjekt() {
        super();
        setLocationRelativeTo(null);
        setSize(500,300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    static Connection getConnection() {
        Connection con = null;
        try {
          con = DriverManager.getConnection("jdbc:ucanaccess://C:/Projekt/testdb.accdb");
        } catch (SQLException ex) {
            // TODO Auto-generated catch block
            Logger.getLogger(TabelleProjekt.class.getName()).log(Level.SEVERE, null, ex);
        }
        return con;
    }

    static ArrayList<Projekt> getProjekt() {
        ArrayList<Projekt> projekt = new ArrayList<Projekt>();

        Connection con = getConnection();
        Statement st;
        ResultSet rs;
        Projekt p;

        try {
            st = con.createStatement();
            rs = st.executeQuery("SELECT * FROM TESTTABLE");

            while(rs.next()){
                p = new Projekt(
                        rs.getInt("KBOE"),
                        rs.getString("NAME"),
                        rs.getString("VORNAME")
                );
                projekt.add(p);

            }

        } catch (SQLException ex) {
            // TODO Auto-generated catch block
            Logger.getLogger(TabelleProjekt.class.getName()).log(Level.SEVERE, null, ex);
        }

        return projekt;

    }

    public static void main(String[] args) {

        JTable table = new JTable();

        DefaultTableModel model = new DefaultTableModel();
        Object[] columnsName = new Object [3];
        columnsName[0] = "Platz";
        columnsName[1] = "Projektname";
        columnsName[2] = "Stimmzahl";

        model.setColumnIdentifiers(columnsName);

        Object[] rowData = new Object[3];

        for (int i = 0; i < getProjekt().size(); i++) {
            rowData[0] = getProjekt().get(i).getPlatz();
            rowData[1] = getProjekt().get(i).getProjektName();
            rowData[2] = getProjekt().get(i).getStimmZahl();

            model.addRow(rowData);

        }

        table.setModel(model);
        System.out.println(getProjekt().size());
        TabelleProjekt window = new TabelleProjekt();
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JScrollPane pane = new JScrollPane(table);
        panel.add(pane,BorderLayout.CENTER);
        window.setContentPane(panel);
        window.setVisible(true);


    } 


}

如果我把它改成

public class TabelleProjekt extends JPanel {

我在这里遇到问题:

public TabelleProjekt() {
    super();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

window.setContentPane(panel);

现在我尝试使用 camickrs 建议并在 SimpleTableDemo 中使用我的逻辑。不知怎么的还是不行。

package de.test.gui;

/*
 * SimpleTableDemo.java requires no other files.
 */

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import java.awt.Dimension;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SimpleTableDemo extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private boolean DEBUG = false;

    static Connection getConnection() {
        Connection con = null;
        try {
            con = DriverManager.getConnection("jdbc:ucanaccess://C:/Projekt/testdb.accdb");
        } catch (SQLException ex) {
            // TODO Auto-generated catch block
            Logger.getLogger(TabelleProjekt.class.getName()).log(Level.SEVERE, null, ex);
        }
        return con;
    }

    class Projekt {
        private int Platz;
        private String ProjektName;
        private String StimmZahl;

        public Projekt(int platz, String projektName, String stimmZahl) {
            this.Platz = platz;
            this.ProjektName = projektName;
            this.StimmZahl = stimmZahl;
        }

        public int getPlatz() {
            return this.Platz;
        }

        public String getProjektName() {
            return this.ProjektName;
        }

        public String getStimmZahl() {
            return this.StimmZahl;
        }

        ArrayList<Projekt> getProjekt() {
            ArrayList<Projekt> projekt = new ArrayList<Projekt>();

            Connection con = getConnection();
            Statement st;
            ResultSet rs;
            Projekt p;

            try {
                st = con.createStatement();
                rs = st.executeQuery("SELECT * FROM JK_850_All_for_Vest_Future_T");

                while (rs.next()) {
                    p = new Projekt(rs.getInt("KBOE"), rs.getString("NAME"), rs.getString("VORNAME"));
                    projekt.add(p);

                }

            } catch (SQLException ex) {
                // TODO Auto-generated catch block
                Logger.getLogger(TabelleProjekt.class.getName()).log(Level.SEVERE, null, ex);
            }

            return projekt;

        }

        public void SimpleTableDemo() {
            /*
             * super(new GridLayout(1,0));
             */

            DefaultTableModel model = new DefaultTableModel();
            Object[] columnsName = new Object[3];
            columnsName[0] = "Platz";
            columnsName[1] = "Projektname";
            columnsName[2] = "Stimmzahl";

            model.setColumnIdentifiers(columnsName);

            Object[] rowData = new Object[3];

            for (int i = 0; i < getProjekt().size(); i++) {
                rowData[0] = getProjekt().get(i).getPlatz();
                rowData[1] = getProjekt().get(i).getProjektName();
                rowData[2] = getProjekt().get(i).getStimmZahl();

                model.addRow(rowData);

                final JTable table = new JTable(model);
                table.setPreferredScrollableViewportSize(new Dimension(500, 370));
                table.setFillsViewportHeight(true);

                if (DEBUG) {
                    table.addMouseListener(new MouseAdapter() {
                        public void mouseClicked(MouseEvent e) {
                            printDebugData(table);
                        }
                    });
                }

                // Create the scroll pane and add the table to it.
                JScrollPane scrollPane = new JScrollPane(table);

                // Add the scroll pane to this panel.
                add(scrollPane);
            }

        }

    }

    private void printDebugData(JTable table) {
        int numRows = table.getRowCount();
        int numCols = table.getColumnCount();
        javax.swing.table.TableModel model = table.getModel();

        System.out.println("Value of data: ");
        for (int i = 0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j = 0; j < numCols; j++) {
                System.out.print("  " + model.getValueAt(i, j));
            }
            System.out.println();
        }
        System.out.println("--------------------------");

    }

    /**
     * Create the GUI and show it. For thread safety, this method should be
     * invoked from the event-dispatching thread.
     */
    private static void createAndShowGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create and set up the content pane.
        SimpleTableDemo newContentPane = new SimpleTableDemo();
        newContentPane.setOpaque(true); // content panes must be opaque
        frame.setContentPane(newContentPane);

        frame.setPreferredSize(new Dimension(500, 370));

        // Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

我刚得到一个空的window

与框架相关的代码不能是扩展 JPanel 的 class 的一部分。该代码应该是创建 GUI 的 class 的 main() 方法的一部分。

阅读 How to Use Tables 上的 Swing 教程部分。

SimpleTableDemo 展示了一种构建代码的方法,以便重要的逻辑成为 class 扩展 JPanel 的一部分。

编辑:

I have two objects that return columnnames and data from the database.... says my objects are undefined?!

如果您遇到编译错误,那么您的代码结构是错误的。

一个简单的方法是为 return TableModel 创建一个方法:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.table.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        JTable table = new JTable( getTableModel() );
        JScrollPane scrollPane = new JScrollPane( table );

        setLayout( new BorderLayout() );
        add(scrollPane, BorderLayout.CENTER);
    }

    private TableModel getTableModel()
    {
        DefaultTableModel model = new DefaultTableModel(5, 3);

        return model;
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

我给出了getTableModel()方法的简单实现。

现在您需要修改该方法以从数据库中获取数据。所以你需要:

  1. 建立SQL
  2. 获取结果集
  3. 从结果集中获取列名
  4. 从 ResultSet 中获取数据行
  5. 使用列名和数据创建 DefaultTableModel
  6. return DefaultTableModel

请注意,如果您只是要将每个字段分别存储在 TableModel 中,则不需要 Projekt class。所以首先让这个简单的方法起作用。

一旦上述建议生效,您可能需要考虑将 Projekt 对象存储在 TableModel 中。在这种情况下,您将需要创建一个自定义 TableModel。查看 Row Table Model 为特定对象创建自定义 TableModel 的示例。

TableModel 的目的是存储数据。应该不需要 ArrayList。那就是你不想在两个地方存储数据。所以ResultSet中的数据应该直接加载到TableModel中。