2017-03-19 11 views
0

私はJava-Newbieです。私は最初のアプリケーションを作成しようとしています。私は多くのチュートリアルやデモを読んで、私の質問に対する具体的な答えを探しましたが、助けになるものは見つけられませんでした。 テスト用に、このクラスを作成しました。これは、アクセスデータベースとJTableを接続します。今度は、このクラスをメインアプリケーションに追加したいのですが、私は既存のクラスをJPanelに変更する必要があります。私はいくつかの変更をテストしましたが、私のアプリケーションの中に出力JTableはもうありません。誰かが私のクラスを変更する必要がある方法を説明することはできますか?どうもありがとう!JPanelを拡張するクラスにJFrameを拡張するクラスを変更します。

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

私はちょうどフレームに関連するコードはJPanelのを拡張するクラスの一部にすることはできません空のウィンドウ

+1

"このクラスをメインアプリケーションに追加したいので、既存のクラスをJPanelに変更する必要があります。"なぜですか?いずれにしても、既存のクラスをJPanelのように扱うには、単にJPanelを継承します。 –

+1

ウィンドウをコンテナに追加することはできません。代わりに、 'public class TabelleProjekt extends JFrame {'を 'public class TabelleProjekt extends JPanel {'に変更してください。今度は 'JPanel'はデフォルトで' FlowLayout'を使用しますので、クラスコンストラクタのレイアウトマネージャを更新したいと思います。 – MadProgrammer

+0

私はすでにそれを試しています。問題はそれ以降に3つの問題が発生することです。\t setLocationRelativeTo(null); 、setDefaultCloseOperation(EXIT_ON_CLOSE);およびwindow.setContentPane(panel);エラーを取得します。そして、ここで私はそれの後に何をすべきか分からない。私が変更しようとしたすべてのコードはもう動作しません。エラーがない場合でも... – cosmohorst

答えて

0

を取得します。そのコードは、GUIを作成するクラスのmain()メソッドの一部でなければなりません。

How to Use TablesのSwingチュートリアルのセクションを読んでください。

SimpleTableDemoは、重要なロジックがJPanelを拡張するクラスの一部であるようにコードを構成する1つの方法を示しています。

編集:

私は、データベースかられる列名とデータを返す2つのオブジェクトを持っている....私のオブジェクトが定義されていないと言います!

コンパイルエラーが発生した場合は、コードの構造が間違っています。

簡単な方法は、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. 列を使用して作成したResultSet
  2. からのDefaultTableModelをデータの行をResultSetの
  3. から列名を取得するResultSet
  4. を取得するSQL
  5. を構築し得ます名前とデータ
  6. リターンのDefaultTableModel

ありませんTableModelに各フィールドを個別に格納する場合は、Projektクラスは必要ありません。だから、この単純なアプローチを最初に働かせてください。

上記の提案が有効になったら、ProjektオブジェクトをTableModelに保存することを検討してください。この場合、カスタムTableModelを作成する必要があります。特定のオブジェクトのカスタムTableModelを作成する例については、チェックアウトRow Table Modelを参照してください。

TableModelの目的は、データを格納することです。 ArrayListは必要ありません。つまり、2つの場所にデータを保存する必要はありません。したがって、ResultSetからのデータはTableModelに直接ロードする必要があります。

+0

ありがとうございます。コードを編集してSimpleTableDemoクラスに入れようとしました。私は私の質問にコードを掲載しました。まだ成功していない。私のミスはどこですか? – cosmohorst

+0

「まだ成功していません。」 - それはどういう意味ですか?あなたの走りの前に再び歩いてください。チュートリアルのコードから始めましょう。要件に関係のないコードを削除します。次に、列名を持つスクロールペインに表のみを表示するようにコードを変更します。その部分はすべてのデータがハードコードされているので簡単です。それがうまくいくと、データベースからデータを追加する心配があります。だから一度に一つの問題を解決してください。作業が停止すると、問題の原因となっている領域が分かります。たとえば、ResultSetのすべての行に対して新しいテーブル/スクロールペインを作成しようとしているのはなぜですか? – camickr

+0

私の問題はここから始まります:final JTable table = new JTable(data、columnNames); - データベースからカラム名とデータを返す2つのオブジェクトがあります。しかし、私は両方の変数を挿入すると、私のオブジェクトは未定義であると言う – cosmohorst

関連する問題