使用 JPanel 列表制作表格(应用百分比大小列)

Posted

技术标签:

【中文标题】使用 JPanel 列表制作表格(应用百分比大小列)【英文标题】:Making Table With List Of JPanels ( With Applying Percentage Size Columns ) 【发布时间】:2019-01-23 13:52:21 【问题描述】:

在这篇Making Table With List Of JPanels 的帖子中,我可以制作一个包含面板列表的表格。这个表有很多特性,但我需要一个新特性,它正在应用百分比列。这意味着我喜欢所有列的宽度不等于并用浮点数组确定。 这是我的班级表:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;

public class PanelTable extends JPanel 
    private String data[][];
    private String columns[];
    private int numberOfRows;
    private int numberOfColumns;
    private JTextArea[] header;
    private JTextArea[][] cell;

    public PanelTable(String data[][], String columns[]) 
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        this.data = data;
        this.columns = columns;


        numberOfRows = data.length;
        numberOfColumns = columns.length;

        makeHeader();
        makeCells();
    

    public void makeCells() 
        cell = new JTextArea[numberOfRows][numberOfColumns];
        for (int rowIndex = 0; rowIndex < numberOfRows; rowIndex++) 
            add(getRow(numberOfColumns, rowIndex));
        
    

    public void makeHeader() 
        header = new JTextArea[numberOfColumns];


        for (int columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) 
            JTextArea ta = new JTextArea();
            ta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            ta.setBackground(new Color(57, 77, 112));
            ta.setForeground(Color.WHITE);
            ta.setText(columns[columnIndex]);
            ta.setFont(new Font("Calibri Light", Font.BOLD, 25));
            ta.setLineWrap(true);
            ta.setWrapStyleWord(true);
            ta.setEditable(false);
            header[columnIndex] = ta;
        

        JPanel rowHeader = new JPanel();
        rowHeader.setLayout(new BoxLayout(rowHeader, BoxLayout.X_AXIS));

        for (int i = 0; i < numberOfColumns; i++) 
            rowHeader.add(header[i]);
        
        add(rowHeader);
    


    public Component getRow(int numberOfColumns, int rowIndex) 

        JPanel row = new JPanel();
        //use GridLayout if you want equally spaced columns
        row.setLayout(new BoxLayout(row, BoxLayout.X_AXIS));
        for (int columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) 
            row.add(getCell(rowIndex, columnIndex));
        
        return row;
    

    public Component getCell(int rowIndex, int columnIndex) 
        if (cell[rowIndex][columnIndex] == null) 
            JTextArea ta = new JTextArea();
            ta.setLineWrap(true);
            ta.setWrapStyleWord(true);
            ta.setEditable(false);
            ta.setSize(50, ta.getHeight());

            ta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            ta.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            ta.setText(data[rowIndex][columnIndex]);
            ta.setFont(new Font("Bmitra", Font.BOLD, 15));

            cell[rowIndex][columnIndex] = ta;
        

        return cell[rowIndex][columnIndex];
    


这是一个用于测试的 gui 示例:

import javax.swing.*;
import java.awt.*;

public class GUI extends JFrame 
    private PanelTable table;
    private JScrollPane scrollPane;

    public GUI()
        super("Bank Table");
        JPanel contentPanel = new JPanel();
        setContentPane(contentPanel);
        contentPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        setLayout(new BorderLayout());
        setMinimumSize(new Dimension(1000,700));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[][] data= new String[][]"0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/01",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/02",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/03",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/04",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/05",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/06",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/07",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/08",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/09",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/10",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/11",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/12",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/13",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/14",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/15",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/16",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/17",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/18",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/19",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/20",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/21",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/22",
                "0212670003009", "ص 318", "77081634","3800ddddddddddddddddddddddddddddddddddddddddd0000","0","331142","2102","وصول چک","08:56:46","1397/05/23",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/24",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/25",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/26",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/15",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/16",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/17",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/18",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/19",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/20",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/21",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/22",
                "0212670003009", "ص 318", "77081634","3800ddddddddddddddddddddddddddddddddddddddddd0000","0","331142","2102","وصول چک","08:56:46","1397/05/23",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/24",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/25",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/26",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/15",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/16",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/17",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/18",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/19",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/20",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/21",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/22",
                "0212670003009", "ص 318", "77081634","3800ddddddddddddddddddddddddddddddddddddddddd0000","0","331142","2102","وصول چک","08:56:46","1397/05/23",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/24",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/25",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/26",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/15",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/16",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/17",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/18",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/19",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/20",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/21",
                "0212670003009", "ص 318", "77081634","380dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd00000","0","331142","2102","وصول چک","08:56:46","1397/05/22",
                "0212670003009", "ص 318", "77081634","3800ddddddddddddddddddddddddddddddddddddddddd0000","0","331142","2102","وصول چک","08:56:46","1397/05/23",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/24",
                "0212670003009", "ص 318", "77081634","38000ddddddddddddddddddddddddddddddddddddddd000","0","331142","2102","وصول چک","08:56:46","1397/05/25",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/26",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/27",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/28",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/29",
                "0212670003009", "ص 318", "77081634","38000000","0","331142","2102","وصول چک","08:56:46","1397/05/30";


        String[] columns= new String[]"ستون ۲", "ستون ۱", "ستون ۱۰","ستون ۹","ستون ۸","ستون ۷","ستون ۶","ستون ۵","ستون ۴","ستون ۳";
        PanelTable table = new PanelTable(data,columns);

        scrollPane = new JScrollPane(table);
        scrollPane.getVerticalScrollBar().setUnitIncrement(50);

        add(scrollPane,BorderLayout.CENTER);

        setVisible(true);
    

    public static void main(String args[])
        GUI gui =new GUI();
    



【问题讨论】:

请通过添加测试数据和JFarme使其成为minimal reproducible example @c0der 我添加了一个用于测试的 GUI 类。 【参考方案1】:

这样做: 首先创建一个宽度大小的数组。例如:

 final int[] columnsWidth =  300, 100, 50, 300, 50 ;

然后在你的方法 makeHeader 和 getCell 上,你设置文本区域的所有属性,也设置首选大小。请参阅下面的代码。这应该会根据大小数组为您提供宽度。

ta.setPreferredSize(new Dimension(columnsWidth[columnIndex], ta.getHeight())); 

让我知道它是否适合你:)

下面是完整的代码: 对于图形用户界面:

import javax.swing.*;
import java.awt.*;

public class GUI extends JFrame 
    private PanelTable2 table;
    private JScrollPane scrollPane;

    public GUI()
        super("Bank Table");
        JPanel contentPanel = new JPanel();
        setContentPane(contentPanel);
        contentPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        setLayout(new BorderLayout());
        setMinimumSize(new Dimension(1000,700));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final String[] columns =  "Big Column", "Serodys", "Ramírez", "Entrada", "MercaSur" ;


        final String[][] data = "2323", "Hundreds","2323", "Hundreds","2323","2323", "Hundreds","2323", "Hundreds","2323"; 
        // final PanelTable22 panel = new PanelTable22(data, columns);

        System.out.println("Hey");
        PanelTable2 table = new PanelTable2(data,columns);
        System.out.println("!!!");

        scrollPane = new JScrollPane(table);
        scrollPane.getVerticalScrollBar().setUnitIncrement(50);

        add(scrollPane,BorderLayout.CENTER);

        setVisible(true);
    

    public static void main(String args[])
        GUI gui =new GUI();
    



对于表模型:

import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class PanelTable2 extends JPanel 
    private String data[][];
    private String columns[];
    private int numberOfRows;
    private int numberOfColumns;
    private JTextArea[] header;
    private JTextArea[][] cell;
    final int[] columnsWidth =  300, 100, 50, 300, 50 ;


    public PanelTable2(String data[][], String columns[]) 
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        this.data = data;
        this.columns = columns;


        numberOfRows = data.length;
        numberOfColumns = columns.length;

        makeHeader();
        makeCells();
    

    public void makeCells() 
        cell = new JTextArea[numberOfRows][numberOfColumns];
        for (int rowIndex = 0; rowIndex < numberOfRows; rowIndex++) 
            add(getRow(numberOfColumns, rowIndex));
        
    

    public void makeHeader() 
        header = new JTextArea[numberOfColumns];


        for (int columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) 
            JTextArea ta = new JTextArea();
            ta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
            ta.setPreferredSize(new Dimension(columnsWidth[columnIndex], ta.getHeight())); 
            ta.setBackground(new Color(57, 77, 112));
            ta.setForeground(Color.WHITE);
            ta.setText(columns[columnIndex]);
            ta.setFont(new Font("Calibri Light", Font.BOLD, 25));
            ta.setLineWrap(true);

            ta.setWrapStyleWord(true);
            ta.setEditable(false);
            header[columnIndex] = ta;
        

        JPanel rowHeader = new JPanel();
        rowHeader.setLayout(new BoxLayout(rowHeader, BoxLayout.X_AXIS));

        for (int i = 0; i < numberOfColumns; i++) 
            rowHeader.add(header[i]);
        
        add(rowHeader);
    


    public Component getRow(int numberOfColumns, int rowIndex) 

        JPanel row = new JPanel();
        //use GridLayout if you want equally spaced columns
        row.setLayout(new BoxLayout(row, BoxLayout.X_AXIS));
        for (int columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) 
            row.add(getCell(rowIndex, columnIndex));
        
        return row;
    

    public Component getCell(int rowIndex, int columnIndex) 
        if (cell[rowIndex][columnIndex] == null) 
            JTextArea ta = new JTextArea();
            ta.setLineWrap(true);
            ta.setWrapStyleWord(true);
            ta.setEditable(false);

            ta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            ta.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            ta.setText(data[rowIndex][columnIndex]);
            ta.setFont(new Font("Bmitra", Font.BOLD, 15));
            ta.setPreferredSize(new Dimension(columnsWidth[columnIndex], ta.getHeight())); 

            cell[rowIndex][columnIndex] = ta;
        

        return cell[rowIndex][columnIndex];
    


【讨论】:

感谢您的尝试,但我以前写过这段代码,我尝试了新的时间,但 工作 我明白了。我拿走了你的代码,它适用于我发布的更改。不知道为什么它不能在你的最后工作.. 上面的数组仅适用于我测试过的 5 列数据。您是否遇到任何错误,或者只是没有改变宽度。 我将您的数组大小更改为更喜欢大小 (10),但它只是没有改变。请给我完整的代码。也许我把你的代码放错了地方。 非常感谢。我测试了你的 gui,这没关系,但是在我的应用程序中不起作用;也许它还有另一个问题。 我希望我也能解决您的实际问题。我会试一试。对于百分比的东西,你可以有一个百分比数组,并根据百分比值和标题的全宽大小计算实际宽度大小。【参考方案2】:

关键是这些行:

//use GridLayout if you want equally spaced columns
row.setLayout(new BoxLayout(row, BoxLayout.X_AXIS));

要将约束应用于列,您可以使用GridBagLayout 而不是BoxLayout

这是使用GridBagLayout的一个非常基本的mcve:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class PanelTable2 extends JPanel 

    public PanelTable2() 

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setPreferredSize(new Dimension(400, 150));
        add(getRow());
    

    Component getRow() 

        int[] percent =  10,40,50;

        JPanel row = new JPanel();
        GridBagLayout layout = new GridBagLayout();
        row.setLayout(layout);

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.CENTER;

        for (int i= 0; i < percent.length; i++) 
            gbc.gridy = 0 ; gbc.gridx = i;
            gbc.weightx = percent[i];
            Component component =  getCell();
            row.add(component, gbc);
        
        return row;
    

    Component getCell() 

        JTextArea ta = new JTextArea(4,11);
        ta.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        ta.setFont(new Font("Bmitra", Font.BOLD, 15));
        return ta;
    

    public static void main(String[] args) throws IOException

        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(new PanelTable2());
        window.pack();
        window.setVisible(true);
    

请注意,mcve 不应代表您的应用程序。它应该是问题的简单表示。GridBagLayout 绝不是唯一的选择。您还可以探索其他替代方案,例如 SpringLayout。

【讨论】:

我在我的应用程序之间使用了您的代码,但不起作用。即使在测试您的代码并输入其单元格百分比时也会出现问题...... 它并不打算按原样在您的代码中使用。它旨在为您指明写作方向,并向您展示我认为您应该学习的内容。这个网站不是“代码编写服务”,而是一个您希望得到指导的地方。 我看到你说朋友;但你的答案很简单,我是初学者,所以我无法解决它们。请帮助我...... 这就是我尝试做的。运行发布的代码,使其适应您的需求,并在需要时询问有关它的具体问题。 我用.setTextta 测试了您的代码,但百分比不适用。这表明您的代码不满足此问题的关键功能。

以上是关于使用 JPanel 列表制作表格(应用百分比大小列)的主要内容,如果未能解决你的问题,请参考以下文章

在固定大小的表格中设置 JSF 列标题的宽度

如何使用 jQuery 为表格制作下拉列表过滤器?

用表格制作百度首页

div 自适应表格列宽度

求助excel制作图表高手 怎么制作双Y轴 也就是左边是百分比值 右边是数值?

进程后调整JPanel [关闭]