0

スクロールバーとボタンはペイントされますが、テーブルのセルはペイントされません。コンソールはデータを正しく印刷しているので、どこで間違ったのか疑問に思います。

public class MyGUIManager extends JPanel {

    protected JFrame frame;
    protected JScrollPane scrollPane=null;
    protected JTable table=null;
    protected TableModel model=null;
    protected JButton btnInsert=null;

    protected String dbname,tblname;
    protected Vector<String> colNames;
    protected Vector<Vector<String>> data,backup;
    protected int col;

    protected MySQLGUIManager() throws Exception{

        frame =new JFrame("MySQL Manager");
        frame.setContentPane(this);
        frame.setMinimumSize(new Dimension(800,600));
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        init();
    }

    protected void init() throws Exception{
        //some inrrelevant operations about database
        loadTbl();
    }

    protected void loadTbl() throws SQLException{
        table=new JTable(data,colNames){
            private static final long serialVersionUID = 1L;
            public void tableChanged(TableModelEvent e){
                int column=e.getColumn();
                assert e.getFirstRow()==e.getLastRow():"more than 1 row have been changed!";
                int row=e.getFirstRow();
                if(scrollPane!=null){
                    //some codes
                }
            }
        };

        model=table.getModel();
        scrollPane=new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(scrollPane,BorderLayout.CENTER);
        btnInsert=new JButton("Insert a row");
        add(btnInsert,BorderLayout.SOUTH);
        repaint();
        revalidate();
//      scrollPane.repaint();
//      scrollPane.revalidate();
        System.out.println(model.getColumnCount()+" "+model.getRowCount());
        for(int i=0;i<data.size();i++){
            for(int j=0;j<data.get(0).size();j++){
                System.out.print(model.getValueAt(i, j)+" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) throws Exception {
        new MySQLGUIManager();
    }

}

(一部のコードは省略されていますが、GUIとは関係ありません。)よろしくお願いします。

4

3 に答える 3

1

UIの既存のコンテナのいずれかにテーブルを実際に追加するコードのどこにも表示されません。

また、pack()を呼び出す前に、テーブルを作成して、目的の親コンポーネントに追加することをお勧めします。

テーブルの作成とデータのロードを分離することを検討することをお勧めします。

また、省略された「一部のコード」は、テーブルの動作に非常に大きな影響を与える可能性があるため、注意が必要です。

于 2012-10-16T23:39:56.127 に答える
1

DefaultTableModelわかりました...疑似SSCCEは役に立たないため、モデルを使用してテーブルを埋める方法の例を次に示します。

package com.model.impl;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;


public class FillTable extends JFrame{

    JPanel panel = new JPanel();
    JLabel lblName = new JLabel("Name: ");
    JLabel lblIp = new JLabel("Ip: ");
    JTextField txtName = new JTextField(10);
    JTextField txtIp = new JTextField(10);
    JButton btnAdd = new JButton("Add");
    JTable table = new JTable();
    DefaultTableModel model = new DefaultTableModel(new Object[][]{}, new String[]{"Name","Ip"});

    public FillTable(){
        super("Test table");
        setLayout(new BorderLayout());
        add(panel,BorderLayout.NORTH);
        panel.add(lblName);
        panel.add(txtName);
        panel.add(lblIp);
        panel.add(txtIp);
        panel.add(btnAdd);
        table.setModel(model);
        add(new JScrollPane(table),BorderLayout.CENTER);

        btnAdd.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                String name = txtName.getText();
                String ip = txtIp.getText();

                model.addRow(new Object[]{name,ip});
            }});
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                FillTable ft = new FillTable();
                ft.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                ft.setLocationByPlatform(true);
                ft.pack();
                ft.setVisible(true);
            }});
    }
}

お役に立てば幸いです。幸運を!

于 2012-10-16T23:48:09.030 に答える
1
  • データ/列モデルには何も追加されません
  • データモデルと列モデルは初期化されていません
  • フレームに自分自身を追加するためだけにJFrame内部からを作成することは悪い習慣ですJPanel

あなたはあなたのメソッドsuper.tableChangedの中から呼び出されていませんtableChanged

table = new JTable(data, colNames) {
    private static final long serialVersionUID = 1L;

    public void tableChanged(TableModelEvent e) {
        super.tableChanged(e);
        int column = e.getColumn();
        assert e.getFirstRow() == e.getLastRow() : "more than 1 row have been changed!";
        int row = e.getFirstRow();
        if (scrollPane != null) {
            //some codes
        }
    }
};
于 2012-10-16T23:53:46.807 に答える