Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改JTable中包含列的行?_Java_Swing_Jtable_Row_Tablemodel - Fatal编程技术网

Java 如何更改JTable中包含列的行?

Java 如何更改JTable中包含列的行?,java,swing,jtable,row,tablemodel,Java,Swing,Jtable,Row,Tablemodel,我创建了我的JTable,如下所示: String[] columns = {"Country", "Continent", "Latitude", "Longitude"}; String[][] data = {{"A","B","C","D"}}; table = new JTable(data,columns); JScrollPane spTable = new JScrollPane(table); pa

我创建了我的JTable,如下所示:

        String[] columns = {"Country", "Continent", "Latitude", "Longitude"};
        String[][] data = {{"A","B","C","D"}};
        table = new JTable(data,columns);
        JScrollPane spTable = new JScrollPane(table);
        panel2.add(spTable);

现在我想改变表的外观,使行与列交换,这意味着表将有4行和1列。在成员方法之间找不到这样的函数,是否可能?谢谢。

< P>这样,我会考虑自定义<代码> TabLimoDele>代码>,它可以处理“切换”状态。

从您的示例中,结果可能会令人惊讶,但这段代码向您展示了总体思路,并允许您使用按钮交换行和列

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class TestTable {

    private static class TogglingTableModel extends AbstractTableModel {

        private boolean toggled = false;
        private final Object[][] data;
        private final Object[] columnNames;

        public TogglingTableModel(Object[][] data, Object[] columnNames) {
            this.columnNames = columnNames;
            this.data = data;
            normalizeData();
        }

        private void normalizeData() {
            for (int i = 0; i < data.length; i++) {
                Object[] o = data[i];
                if (o.length < columnNames.length) {
                    data[i] = Arrays.copyOf(o, columnNames.length);
                }
            }
        }

        @Override
        public String getColumnName(int column) {
            if (toggled) {
                Object valueAt;
                if (column == 0) {
                    valueAt = columnNames[0];
                } else {
                    valueAt = data[column - 1][0];
                }
                return valueAt != null ? valueAt.toString() : null;
            } else {
                Object object = columnNames[column];
                return object != null ? object.toString() : null;
            }
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

        @Override
        public int getColumnCount() {
            if (toggled) {
                return data.length + 1;
            } else {
                return columnNames.length;
            }
        }

        @Override
        public int getRowCount() {
            if (toggled) {
                return columnNames.length - 1;
            } else {
                return data.length;
            }
        }

        @Override
        public Object getValueAt(int row, int column) {
            if (toggled) {
                if (column == 0) {
                    return columnNames[row + 1];
                } else {
                    return data[column - 1][row + 1];
                }
            } else {
                return data[row][column];
            }
        }

        @Override
        public void setValueAt(Object aValue, int row, int column) {
            if (toggled) {
                if (column == 0) {
                    columnNames[row + 1] = aValue;
                } else {
                    data[column - 1][row + 1] = aValue;
                }
            } else {
                data[row][column] = aValue;
            }
        }

        public boolean isToggled() {
            return toggled;
        }

        public void toggle() {
            toggled = !toggled;
            fireTableStructureChanged();
        }
    }

    private TogglingTableModel tableModel;

    public TestTable() {
        JFrame frame = new JFrame(TestTable.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String[] columns = { "Country", "Continent", "Latitude", "Longitude" };
        String[][] data = { { "A" }, { "B" }, { "C" }, { "D" }, { "E" } };
        tableModel = new TogglingTableModel(data, columns);
        JTable table = new JTable(tableModel);
        JPanel buttonPanel = new JPanel();
        JButton togglingButton = new JButton("Toggle table");
        togglingButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                tableModel.toggle();
            }
        });
        buttonPanel.add(togglingButton);
        frame.add(new JScrollPane(table));
        frame.add(buttonPanel, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestTable fs = new TestTable();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.array;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入javax.swing.table.AbstractTableModel;
公共类测试表{
私有静态类TogglingTableModel扩展了AbstractTableModel{
private boolean toggled=false;
私有最终对象[][]数据;
私有最终对象[]列名称;
公共TogglingTableModel(对象[][]数据,对象[]列名称){
this.columnNames=columnNames;
这个数据=数据;
归一化数据();
}
私有void normalizeData(){
对于(int i=0;i
我还没有测试过这一点,但我现在能想到的唯一方法是创建另一个
JTable
,获取并填充行空间中的列值,以及列空间中的行值。不要忘记使用辅助变量。