0

したがって、動作するフレーム内のJScrollPane内にJTableがあります。私がやりたいのは、表示されているテーブルを、他の情報を表示し、列/行が多い/少ない別のテーブルに変更することです。どうすればよいですか?

ScrollPaneに別のテーブルを配置するなどの方法を試しましたが、それは機能せず、ScrollPaneをフレームに再配置すると消えます。

編集:

これがこの問題に関係するすべてのコードだと思います。私は単に機能を呼び出してビューを変更します。

    Object[][] userData = new Object[50][6];
    userTable = new JTable(userData, new String[] { "Namn", "Adress", 
            "Telefon", "Personnummer", "PIN", "Antal cyklar" }) {
        public boolean isCellEditable(int rowIndex, int colIndex) {
            return false;
        }
    };
    userTable.setSelectionMode(0);
    userTable.getTableHeader().setReorderingAllowed(false);
    Object[][] bikeData = new Object[50][7];
    bikeTable = new JTable(bikeData, new String[] { "Ägare", "Streckkod", 
            "Färg", "Märke", "Ram-nummer", "Senast hämtad", "Senast lämnad" }) {
        public boolean isCellEditable(int rowIndex, int colIndex) {
            return false;
        }
    };
    bikeTable.setSelectionMode(0);
    bikeTable.getTableHeader().setReorderingAllowed(false);
    JScrollPane tablePane = new JScrollPane(bikeTable);
    frame.add(tablePane);

    frame.setVisible(true);
}

public void displayUsers(){
    tablePane.setViewportView(userTable);
}

public void displayBikes(){
    tablePane.setViewportView(bikeTable);
}
4

3 に答える 3

2

基になるモデルを変更すると、機能するはずです。

table.setModel(newModel)

また、特定のセル/列に対して特別なことをしている場合は、レンダラーも更新する必要があります。

于 2012-05-03T12:51:22.220 に答える
2

これを試しましたか:

scrollPane.setViewportView(yourNewTable);

これにより、スクロールペインに表示されるコンポーネントが置き換えられます。もちろん、JTableとその列のモデルはいつでも変更できますが、それは私の好みではありません。

編集:これを示すスニペットは次のとおりです。

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

public class Test {

    public static void main(String... args) {
        JFrame frame = new JFrame();
        final Vector<String> string = new Vector<String>();
        final JTable table = new JTable(getTableModel("First", 1));
        final JTable table2 = new JTable(getTableModel("Second", 3));
        final JButton click = new JButton("Click me");
        final JScrollPane scrollPane = new JScrollPane(table);
        click.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (table2.getParent() == null) {
                    scrollPane.setViewportView(table2);
                } else {
                    scrollPane.setViewportView(table);
                }
            }
        });
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(click, BorderLayout.EAST);
        panel.add(scrollPane);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }

    private static TableModel getTableModel(final String prefix, final int colCount) {
        return new TableModel() {

            @Override
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                // TODO Auto-generated method stub

            }

            @Override
            public void removeTableModelListener(TableModelListener l) {
                // TODO Auto-generated method stub

            }

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return prefix + "Hello cell (" + rowIndex + "," + columnIndex + ")";
            }

            @Override
            public int getRowCount() {
                return 30;
            }

            @Override
            public String getColumnName(int columnIndex) {
                return "Column " + columnIndex;
            }

            @Override
            public int getColumnCount() {
                return colCount;
            }

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return String.class;
            }

            @Override
            public void addTableModelListener(TableModelListener l) {
                // TODO Auto-generated method stub

            }
        };
    }

}
于 2012-05-03T13:01:20.780 に答える
0

2つのjTable(2つのモデル)を維持している場合、おそらく最も簡単な方法は、スクロールペインのビューポートを設定することです。

jscrollpane.setViewportView(mySecondJTable);

その後、元に戻します。

jscrollpane.setViewportView(myFirstJTable);
于 2012-05-03T13:02:50.037 に答える