当前位置: 首页 > 知识库问答 >
问题:

为什么JTable不能正确调整大小?

傅正阳
2023-03-14

你好,谢谢你花时间处理我的问题。首先让我向你介绍我的虚拟/培训项目。下面列出的类应该代表MVC模型(模型、视图、控制器)之后的程序。运行主类时,会打开FileChooser,从中可以选择. csv-File,其中包含保存为String[][]的信息。这个String[][]然后在视图类中可视化为JTable。这个JTable是带有BorderLayout的JFrame中的JPanel的一部分。中心。现在的问题,为什么不会我的JTable调整大小正确,如果我重新调整JFrame?我在网上搜索,甚至this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);根本不会影响调整大小。我希望你能以某种方式帮助我。谢谢!

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * This class is responsible for the actual data being "processed".
 * It saves the Strings out of a File into a String[][] and further more updates its content,
 * if changed by the View-Class.
 * 
 * @author CodeScrub
 * @version 2022-01-13
 */

public class Model {

    private File selectedFile;
    
    private String[][] dataSetTotal;
    private ArrayList<String> dataSetList;
    
    private ArrayList<String> tableDatasetList;
    
    public Model() {
        dataSetList = new ArrayList<String>();
        tableDatasetList = new ArrayList<String>();
    }
    
    public void evaluateData() {
        try {
            Scanner scanner = new Scanner(this.selectedFile);
            while(scanner.hasNextLine()) {
                String data = scanner.nextLine();
                dataSetList.add(data);
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        
        this.dataSetTotal = new String[dataSetList.size()][3];
        
        for(String info : dataSetList) {
            String[] dataSetSeperate = info.split(";");
            for(int i = 0; i < dataSetSeperate.length; i++) {
                dataSetTotal[dataSetList.indexOf(info)][i] = dataSetSeperate[i];
            }
        }
    }
    
    public void setSelectedFile(File selectedFile) {
        this.selectedFile = selectedFile;
    }
    
    public File getSelectedFile() {
        return this.selectedFile;
    }
    
    public String[][] getDataSetTotal(){
        return this.dataSetTotal;
    }
    
    public void updateData(String[][] tableContent) {
        for(int i = 0; i < tableContent.length; i++) {
            String dataSetSeperate = "";
            for(int j = 0; j < tableContent[i].length; j++) {
                if(j < 2) {
                    dataSetSeperate = dataSetSeperate + tableContent[i][j] + ";";
                }else {
                    dataSetSeperate = dataSetSeperate + tableContent[i][j];
                }
            }
            this.tableDatasetList.add(dataSetSeperate);
        }
        
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(this.selectedFile));
            for(String info : this.tableDatasetList){
                writer.write(info + "\n");
            }
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.tableDatasetList = new ArrayList<String>();
    }
}
import java.awt.Dimension;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 * This class visualizes the processed data inside a JFrame.
 * The data sets are visualized as a JTable.
 * 
 * @author CodeScrub
 * @version 2022-01-13
 */

public class View extends JFrame{
    
    private static final long serialVersionUID = 1L;
    
    private JFileChooser chooser;
    private FileNameExtensionFilter filter;
    
    private JLabel firstName;
    private JLabel lastName;
    private JLabel socialSecurityNumber;
    
    private JButton buttonSafeChanges;
    
    private JScrollPane scrollPane;
    
    private JTable table;
    
    private JPanel centerPanel;
    
    private Controller controller;
    
    public View(Controller controller) {
        this.controller = controller;
        init();
    }
    
    private void init() {
        this.chooser = new JFileChooser();
        this.filter = new FileNameExtensionFilter(
                "CSV Files", "csv");
        this.chooser.setFileFilter(filter);
        this.chooser.setPreferredSize(new Dimension(800,500));
        int returnVal = chooser.showOpenDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            this.controller.updateData(chooser.getSelectedFile());
            this.controller.evaluateData();
            
            this.firstName = new JLabel("First Name");
            this.lastName = new JLabel("Last Name");
            this.socialSecurityNumber = new JLabel("Social Security Number");
            
            this.centerPanel = new JPanel(new BorderLayout());
            
            String[] title = {firstName.getText() , lastName.getText() , socialSecurityNumber.getText()}; 
            this.table = new JTable(this.controller.getDataSetTotal(), title);
            this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
            this.centerPanel.add(table, BorderLayout.CENTER);
            
            this.scrollPane = new JScrollPane(this.table);
            this.centerPanel.add(scrollPane, BorderLayout.EAST);
            
            this.buttonSafeChanges = new JButton("Safe Changes");
            this.buttonSafeChanges.addActionListener(controller);
            
            this.centerPanel.add(table.getTableHeader(), BorderLayout.NORTH);
            this.add(centerPanel,BorderLayout.CENTER);
            this.add(buttonSafeChanges, BorderLayout.SOUTH);
            this.setTitle("MVC");
            this.setSize(475,350);
            this.setMinimumSize(new Dimension(475,350));
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            this.setVisible(true);
            getTableContent();
        }else {
            System.exit(0);
        }
    }
    
    public JButton getButtonSafeChanges() {
        return this.buttonSafeChanges;
    }
    
    public String[][] getTableContent() {
        String[][] tableContent;
        tableContent = new String[this.table.getRowCount()][this.table.getColumnCount()];
        for(int i = 0; i < table.getRowCount(); i++) {
            for(int j = 0; j < table.getColumnCount(); j++) {
                tableContent[i][j] = table.getValueAt(i,j).toString();
            }
        }
        return tableContent;
    }
}
import java.io.File;

/**
 * This class works as an interface between the view- and model-class 
 * and also handles the action performed after the button press "Safe Changes".
 * 
 * @author CodeScrub
 * @version 2022-01-13
 */

public class Controller implements ActionListener{

    private View view;
    private Model model;
    
    public Controller() {
        this.model = new Model();
        this.view = new View(this);
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == this.view.getButtonSafeChanges()) {
            this.model.updateData(this.view.getTableContent());
        }
    }
    
    public void updateData(File selectedFile) {
        this.model.setSelectedFile(selectedFile);
    }
    
    public File getSelectedFile() {
        return this.model.getSelectedFile();
    }
    
    public void evaluateData() {
        this.model.evaluateData();
    }
    
    public String[][] getDataSetTotal(){
        return this.model.getDataSetTotal();
    }
}
public class MVC_Testclass {

    public static void main(String[] args) {
        Controller controller = new Controller();
    }
}

共有1个答案

彭宏深
2023-03-14

基本上,当您为JTable使用JScrollPane容器时,只需在中心面板中添加滚动窗格,并确保将其添加到中心。下面解决了代码中的问题。

this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
//this.centerPanel.add(table, BorderLayout.CENTER);

this.scrollPane = new JScrollPane(this.table);
this.centerPanel.add(scrollPane, BorderLayout.CENTER);

 类似资料:
  • 编辑:它现在可以工作了,我用画布扩展了这个类,将它的大小设置为宽度和高度,然后将它添加到JFrame,然后打包。这管用!但我认为造成这种情况的原因不是尺寸大小,而是我呈现它的方式,我从JFrame中获得了bufferStrategy,而不是画布,这不是应该的方式。

  • 一些修补和我发现新的卷没有BIOS引导分区。因此,我使用gdisk创建了一个MBR,并将MBR从原始卷(它可以工作,我可以使用它启动实例)复制到新卷。现在该实例没有终止,但我无法ssh到新启动的实例中。 发生这种情况背后的原因可能是什么?我如何(从日志/AWS控制台等)获得更多关于为什么会发生这种情况的信息?

  • 问题内容: 我在Java中使用Apache POI创建一个Excel文件。我填写了数据,然后尝试自动调整每列的大小,但是大小总是错误的(我 认为是 一致的)。前两行始终(?)完全折叠。当我在excel中自动调整列的大小时,它可以完美运行。 (我相信)没有空白单元被写入,并且调整大小是我要做的 最后一 件事。 这是相关的代码: 这是一个精简的版本,没有错误处理等。 我知道那里有一些类似的问题,但是其

  • 问题内容: 所以我已经在Java编程学了一个学期左右的时间,而且我遇到了几次这个问题,最后才开始提出问题。 如果我做一个然后设置大小,例如。帧实际上并不长。据我所知,它实际上更长。另外,如果您将垂直尺寸设置得非常小(低于30),则框架甚至不会显示,只有操作系统顶部的窗口栏和框架才会变大,直到您将值超过30(这样看起来与)相同。为什么会这样,修复起来并不难,但是很奇怪,我很好奇为什么会这样? 如果您

  • 问题内容: 我正在做一个游戏,但是每当我运行第二个jFrame时,我都必须调整它的大小才能获得第二个jFrame的正确大小,有人知道为什么吗? 这是第一个jFrame类中的方法,它将打开第二个类: 这是第二个jFrame类,我必须重新调整它的大小才能正确显示山雀: 问题答案: 我读得很快,正在寻找一种特定的方法。 该方法是: JFrame中的此方法可能非常有用,但也很难处理,您需要非常了解如何设置

  • 我正在使用vscode,eslint正在运行,但它在同一项目中的其他文件中找不到某些文件中的错误。 有什么方法可以调试这个吗?像一个更详细输出的选项,它会告诉我在vscode中运行时每个文件的配置在哪里?