Java 如何在两个JTables之间切换?

Java 如何在两个JTables之间切换?,java,swing,jtable,jscrollpane,Java,Swing,Jtable,Jscrollpane,所以我在一个工作的框架内的JScrollPane中有一个JTable。我要做的是将正在显示的表更改为另一个表,该表显示一些其他信息,并且具有更多/更少的列/行。我该怎么做 我尝试过在滚动窗格中放置另一个表之类的方法,但没有效果,如果我将滚动窗格重新放置在框架中,它就会消失 编辑: 我认为这就是所有与这个问题有关的代码。我只是简单地调用funktions来改变视图 Object[][] userData = new Object[50][6]; userTable = new JT

所以我在一个工作的框架内的JScrollPane中有一个JTable。我要做的是将正在显示的表更改为另一个表,该表显示一些其他信息,并且具有更多/更少的列/行。我该怎么做

我尝试过在滚动窗格中放置另一个表之类的方法,但没有效果,如果我将滚动窗格重新放置在框架中,它就会消失

编辑:

我认为这就是所有与这个问题有关的代码。我只是简单地调用funktions来改变视图

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

如果您更改基础模型,它应该可以工作

table.setModel(newModel)

如果要对某些单元格/列执行特殊操作,可能还需要更新渲染器。

如果更改基础模型,它应该可以工作

table.setModel(newModel)
如果要对某些单元格/列执行特殊操作,可能还需要更新渲染器。

您是否尝试过以下方法:

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

            }
        };
    }

}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.event.TableModelListener;
导入javax.swing.table.TableModel;
公开课考试{
公共静态void main(字符串…参数){
JFrame=新JFrame();
最终向量字符串=新向量();
最终JTable表=新JTable(getTableModel(“First”,1));
最终JTable表2=新JTable(getTableModel(“第二”,3));
最终JButton click=新JButton(“单击我”);
最终JScrollPane滚动窗格=新JScrollPane(表);
单击.addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
if(表2.getParent()==null){
scrollPane.setViewportView(表2);
}否则{
scrollPane.setViewportView(表);
}
}
});
JPanel panel=newjpanel(newborderlayout());
面板。添加(单击,BorderLayout.EAST);
panel.add(滚动窗格);
frame.getContentPane().add(面板);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
私有静态TableModel getTableModel(最终字符串前缀,最终int colCount){
返回新的TableModel(){
@凌驾
public void setValueAt(对象有效、int行索引、int列索引){
//TODO自动生成的方法存根
}
@凌驾
公共void removeTableModelListener(TableModelListener l){
//TODO自动生成的方法存根
}
@凌驾
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
返回前缀+“Hello单元格(“+rowIndex+”,“+columnIndex+”);
}
@凌驾
public int getRowCount(){
返回30;
}
@凌驾
公共字符串getColumnName(int columnIndex){
返回“Column”+columnIndex;
}
@凌驾
public int getColumnCount(){
返回colCount;
}
@凌驾
公共类getColumnClass(int columnIndex){
返回字符串.class;
}
@凌驾
公共void addTableModelListener(TableModelListener l){
//TODO自动生成的方法存根
}
};
}
}
您是否尝试过以下方法:

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

            }
        };
    }

}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.event.TableModelListener;
导入javax.swing.table.TableModel;
公开课考试{
公共静态void main(字符串…参数){
JFrame=新JFrame();
最终向量字符串=新向量();
最终JTable表=新JTable(getTableModel(“First”,1));
最终JTable表2=新JTable(getTableModel(“第二”,3));
最终JButton click=新JButton(“单击我”);
最终JScrollPane滚动窗格=新JScrollPane(表);
单击.addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
if(表2.getParent()==null){
scrollPane.setViewportView(表2);
}否则{
scrollPane.setViewportView(表);
}
}
});
JPanel panel=newjpanel(newborderlayout());
面板。添加(单击,BorderLayout.EAST);
panel.add(滚动窗格);
frame.getContentPane().add(面板);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
私有静态TableModel getTableModel(最终字符串前缀,最终int colCount){
返回新的TableModel(){
@凌驾
public void setValueAt(对象有效、int行索引、int列索引){