0

N 行と 2 列を含む Panel を作成しようとしています。最初の列は可変長のラベルですが、特定の制限内 (言語によって長さが異なります) であり、2 番目の列には非常に長い可能性のあるフィールドが含まれています。文章。

NetBeans を使用して GridBagLayout を試してみましたが、パネルをスケーリングしたり、非常に長いフィールドを追加したりすると、結果が乱雑になります。JPanel のスクリーンショットの下で、私の意味を確認してください。

ここに画像の説明を入力

左の列を左の境界線から離し、最初の列を最も長いラベルよりも小さい値にサイズ変更しないようにしたい (ラベルは常に読み取り可能でなければならない)、2 番目の列は利用可能な水平方向のスペースまで視覚化し、次に、ドットを表示します(テキストをトリミングしません)。

また退屈なのは、向きを 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. 最初の列のすべてのコンポーネントについてはweightx0 に設定し、2 番目の列では 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

列の幅を最長のコンテンツに合わせて調整するために、2 つの列を持つ JTable とTableColumnAdjusterまたはTableCellRendererを使用できます。

于 2013-03-18T11:37:30.233 に答える
1

それを実現する 1 つの方法は、「ネストされたレイアウト」で 3 つのパネルを使用することです。パネルは次のように配置されます。

  1. 外側のパネルに使用BorderLayoutします。パネル 2 と 3 が含まれています。
  2. 単一の列を使用GridLayout- 挿入BorderLayout.LINE_START
  3. 単一の列を使用GridLayout- 挿入BorderLayout.CENTER
于 2013-03-18T11:41:11.933 に答える