如何均匀化JTable中的组件大小?

问题描述 投票:0回答:1

我有一个包含两列的JTable。第一个包含一个自定义组件(条形图),其中包含三个组件:JLabel lMinLabel,Graph lGraph和JLabel lMaxLabel。这是我所拥有的:

enter image description here

这是我想要的:enter image description here

值标签在不同的行中可以具有不同的大小,这会修改条形图的大小。我希望所有JTable行的条形图都具有相同的大小。

我试图将标签放在面板中,并为这些面板设置最小尺寸(具有固定值)。

这是我的代码:

package test;

import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class JTableExample extends JFrame {

    public JTableExample() {
        super("JTable Example");

        DefaultTableModel dm = new DefaultTableModel();
        dm.setDataVector(new Object[][] { { new BarGraph(0, 10, 25, 27, 75, 90,100), "foo" },
            { new BarGraph(100, 1000, 2500, 5600, 7500, 9000,10000), "bar" } },
                new Object[] { "Graph", "String" });

        JTable table = new JTable(dm);
        table.getColumn("Graph").setCellRenderer(new Renderer());
        JScrollPane scroll = new JScrollPane(table);
        getContentPane().add(scroll);
        setSize(800, 100);
        setVisible(true);
    }

    public static void main(String[] args) {
        JTableExample frame = new JTableExample();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class Renderer implements TableCellRenderer {
    public Renderer() {}
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
        return (Component) value;
    }
}

我尝试设置标准尺寸的条形图类:

package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BarGraph extends JComponent {


    private final double preWarningMax;
    private final double preWarningMin;
    private final double valueMax;
    private final double valueMin;
    private final double warningMax;
    private final double warningMin;
    private double value;

    public BarGraph(double pValueMin, double pWarningMin, double pPreWarningMin, double pValue, double pPreWarningMax,
            double pWarningMax, double pValueMax) {
        super();
        valueMin = pValueMin;
        warningMin = pWarningMin;
        preWarningMin = pPreWarningMin;
        value = pValue;
        preWarningMax = pPreWarningMin;
        warningMax = pWarningMax;
        valueMax = pValueMax;
        this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

        JPanel lMinPanel = new JPanel();
        JLabel lMinValue = new JLabel(Double.toString(valueMin));
        lMinPanel.add(lMinValue);

        Graph lGraph = new Graph();

        JPanel lMaxPanel = new JPanel();
        JLabel lMaxValue = new JLabel(Double.toString(valueMax));
        lMaxPanel.add(lMaxValue);

        add(lMinPanel);
        add(lGraph);
        add(lMaxPanel);

        lMinPanel.setMinimumSize(new Dimension(15, 5));
        lMaxPanel.setMinimumSize(new Dimension(15, 5));
    }

    private class Graph extends JComponent {

        @Override
        protected void paintComponent(Graphics pGraphics) {
            ...
        }
    }
}

使JTable行之间的条形图大小均匀的最佳方法是什么?

java swing jtable layout-manager
1个回答
0
投票
JPanel lMinPanel = new JPanel();
JLabel lMinValue = new JLabel(Double.toString(valueMin));
lMinPanel.add(lMinValue);

您为什么要创建一个额外的面板来容纳每个JLabel?

注意文本在单元格顶部下方的位置。这是因为面板的默认FlowLayout在面板的所有边缘周围添加了5个像素。

摆脱面板,仅使用BoxLayout将JLabel直接添加到面板中。

我尝试设置标准尺寸的条形图类:

    lMinPanel.setMinimumSize(new Dimension(15, 5));
    lMaxPanel.setMinimumSize(new Dimension(15, 5));

问题是BoxLayout尊重“最大”大小。因此,所有组件都将增长以填充可用空间。

相反,我认为您想设置最大尺寸。因此,根据我的第一个建议,基本代码应类似于:

lMinValue.setMaximumValue( new Dimension(50, lminValue.getPreferredSize().height) );

您还将为此设置lMaxValue。

然后将lMinValue / lMaxValue添加到组件。

您将不理会图表面板的最大尺寸,因此在将100个像素分配给两个标签之后,它应该逐渐占据所有空间。

注意,这假定条形图的最大尺寸大于其首选尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.