java jframe jtable jpanel ucanaccess

java - Cambiar la clase que extiende JFrame a la clase que extiende JPanel



jtable ucanaccess (1)

Soy un principiante de Java y estoy tratando de construir mi primera aplicación. Leí muchos tutoriales y demostraciones y busqué respuestas concretas a mi pregunta, pero no he encontrado algo que me ayude. Para las pruebas escribí esta clase, que conecta una base de datos de acceso con una JTable. Ahora quiero agregar esta clase en una aplicación principal, pero por lo tanto tengo que cambiar mi clase actual a JPanel. Probé algunos cambios, pero ya no obtengo una salida JTable dentro de mi aplicación. ¿Alguien puede explicar la forma en que tengo que cambiar mi clase? ¡Muchas gracias!

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); } }

Si lo cambio a

public class TabelleProjekt extends JPanel {

Tengo problemas aquí:

public TabelleProjekt() { super(); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); window.setContentPane(panel);

Ahora traté de usar el consejo de camickrs y usar mi lógica en SimpleTableDemo. De alguna manera todavía no funciona.

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(); } }); } }

Acabo de obtener una ventana vacía


El código relacionado con el marco no puede ser parte de la clase que extiende el JPanel. Ese código debe ser parte del método main () de su clase que crea la GUI.

Lea la sección del tutorial Swing sobre Cómo usar tablas .

SimpleTableDemo muestra una forma de estructurar su código para que la lógica importante sea parte de la clase que extiende el JPanel.

Editar:

Tengo dos objetos que devuelven nombres de columna y datos de la base de datos ... ¿dice que mis objetos no están definidos?

Bueno, la estructura de su código es incorrecta si está obteniendo un error de compilación.

Una forma simple es crear un método para devolver el modelo de tabla:

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() una implementación simple del método getTableModel() .

Ahora necesita modificar ese método para obtener los datos de su base de datos. Entonces necesitas hacer lo siguiente:

  1. construir el SQL
  2. obtener el ResultSet
  3. obtener los nombres de las columnas del ResultSet
  4. obtener las filas de datos del ResultSet
  5. crear el DefaultTableModel usando los nombres y los datos de las columnas
  6. devolver el DefaultTableModel

Tenga en cuenta que no hay necesidad de la clase Projekt si va a almacenar cada campo por separado en TableModel. Así que primero trabaje con este enfoque simple.

Una vez que obtenga la sugerencia anterior funcionando, puede considerar almacenar el objeto Projekt en TableModel. En este caso, deberá crear un TableModel personalizado. Checkout Row Table Model para un ejemplo de creación de un TableModel personalizado para un objeto específico.

El objetivo de TableModel es almacenar los datos. No debería haber necesidad de ArrayList. Es decir, no desea almacenar datos en dos lugares. Por lo tanto, los datos del ResultSet deben cargarse directamente en TableModel.