0

我正在尝试创建一个包含 N 行和 2 列的面板,其中第一列是具有可变长度但在一定限制内的标签(它根据语言改变长度),而第二列包含可能很长的字段文本。

我已经尝试使用 NetBeans 使用 GridBagLayout,但是在缩放面板或添加非常长的字段时结果很混乱。在 JPanel 的屏幕截图下面看看我的意思:

在此处输入图像描述

我希望左列与左边框隔开,第一列永远不会调整为小于其最长标签的值(标签必须始终可读),而第二列应该可视化到其可用的水平空间和然后显示点(而不是裁剪文本)。

同样无聊的是,尽管我将 NorthWest 定义为方向,但面板显示在中心垂直对齐

编辑:我使用 TableColumnAdjuster 来使用表格行而不是标签作为我的值,以便我可以用鼠标选择值。我仍然有行但是适合文本的长度而不是包含面板的长度:

public class TestPanel extends JPanel
{
    private static ArrayList<String> columnNames = new ArrayList<>();
    static JTable table;
    MyTableModel myTableModel = new MyTableModel();

    static class MyTableModel extends AbstractTableModel
    {
        private String[] columnNames =
        {
            "Name", "Value"
        };
        private Object[][] data =
        {
            { "Subject", "very very very very very very very very very very very very very very very very long subject"},
            { "Date", "" },
            { "Location", "" },
            { "Status", "" },
            { "Notes", "" }
        };

        @Override
        public int getColumnCount()
        { return columnNames.length; }

        @Override
        public int getRowCount()
        {  return data.length; }

        @Override
        public String getColumnName(int col)
        {  return columnNames[col]; }

        @Override
        public Object getValueAt(int row, int col)
        {  return data[row][col]; }

        @Override
        public Class getColumnClass(int c)
        { return getValueAt(0, c).getClass(); }

        @Override
        public boolean isCellEditable(int row, int col)
        { return false; }

        @Override
        public void setValueAt(Object value, int row, int col)
        {        }
    }

    public TestPanel()
    {
        table = new JTable(myTableModel);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        TableColumnAdjuster tca = new TableColumnAdjuster(table);
        tca.adjustColumns();

        JPanel panel = new JPanel(new GridBagLayout());
        panel.add(table);
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.weighty = 1.0;
        constraints.fill = GridBagConstraints.VERTICAL;
        panel.add(Box.createGlue(), constraints);
        add(panel);
    }

    public static void main(String args[])
    {
        JFrame frame = new JFrame();
        frame.setContentPane(new TestPanel());
        frame.setSize(300, 800);
        frame.setVisible(true);
    }
}

而 TableColumnAdjuster 来自TableColumnAdjuster .. 我得到的仍然如下

在此处输入图像描述

4

3 回答 3

2

您可能对GridBagLayout.

  1. 要将所有内容推到顶部,要么将GridBagLayout面板包装到另一个面板BorderLayout中(如位置中的面板NORTH),要么在底部添加一个组件,以占用所有额外空间
  2. 对于第一列中的所有组件,设置weightx为 0,而在第二列中,将其设置为大于 0 的值。
  3. 要在左边框和标签之间添加一些空间,只需使用insets

这是一个说明这一点的示例:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Random;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Gridbag {

    public void initUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridBagLayout());
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            String label = "Label " + (i + 1);
            StringBuilder fieldValue = new StringBuilder();
            int r = 1 + random.nextInt(4);
            for (int j = 0; j < r; j++) {
                fieldValue.append("Some long value that may be very long in some cases");
            }
            addField(panel, label, fieldValue.toString());
        }
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.weighty = 1.0;
        constraints.fill = GridBagConstraints.VERTICAL;
        panel.add(Box.createGlue(), constraints);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    private void addField(JPanel panel, String label, String fieldValue) {
        GridBagConstraints labelGBC = new GridBagConstraints();
        labelGBC.insets = new Insets(0, 5, 0, 5);
        labelGBC.anchor = GridBagConstraints.EAST;
        GridBagConstraints fieldGBC = new GridBagConstraints();
        fieldGBC.gridwidth = GridBagConstraints.REMAINDER;
        fieldGBC.weightx = 1.0;
        fieldGBC.anchor = GridBagConstraints.WEST;
        panel.add(new JLabel(label), labelGBC);
        panel.add(new JLabel(fieldValue), fieldGBC);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Gridbag().initUI();
            }
        });
    }

}
于 2013-03-18T12:43:22.070 回答
1

您可以使用具有两列的 JTable 和TableColumnAdjusterTableCellRenderer,以便将列的宽度调整为最长的内容。

于 2013-03-18T11:37:30.233 回答
1

实现它的一种方法是在“嵌套布局”中使用 3 个面板。面板的布局如下。

  1. 用于BorderLayout外面板,它包含面板 2 和 3。
  2. 使用单列GridLayout- 放入BorderLayout.LINE_START
  3. 使用单列GridLayout- 放入BorderLayout.CENTER
于 2013-03-18T11:41:11.933 回答