Установка JTable внутри панели

Я использую JTable и добавляю его к панели, которая использует gridbaglayout следующим образом:

JTable qdbs = new JTable(rowData, columnNamesVector);
qdbs.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

panel.add(qdbs, c);

Я не хочу, чтобы таблица находилась в панели прокрутки, но я хочу, чтобы таблица занимала всю ширину панели. Как бы это сделать?

SSCCE по запросу:

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

public class Main{

    public static void main(String[] args) {
    new TestFrame();
    }

    public static class TestFrame extends JFrame{
    public TestFrame() {
        this.setTitle("SSCCE");

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 0;

        c.insets = new Insets(10,10,10,10);
        JTable testTable = new JTable(10,2);
        panel.add(testTable, c);

        this.add(panel);
        this.pack();
        this.setVisible(true);
    }
    }

}

Я бы хотел, чтобы эта таблица всегда занимала всю ширину панели (кроме вставки). В настоящее время таблица не изменяет размер при изменении размера кадра.

Ответ 1

Вам нужно добавить ограничения, чтобы указать макет, что делать с большим количеством места. В SSCCE добавьте следующие элементы:

  c.fill = GridBagConstraints.BOTH;
  c.weightx = 1;
  c.weighty = 0;

Ответ 2

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

public class Test
{
    public static void main(String args[]) throws Exception
    {
        JPanel panel = new JPanel( new GridBagLayout() );
        JTable table = new JTable(5, 5);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(table, gbc);

        JFrame frame = new JFrame();
        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }
}

Если вам нужна дополнительная помощь, напишите SSCCE, который демонстрирует проблему.

Ответ 3

c - это GridBagConstraint или что-то в этом роде, я полагаю? Самое простое - установить LayoutManager в JPanel на BorderLayout, а затем просто добавить с ограничением BorderLayout.CENTER.

Ответ 4

hmmm

Алекс Блысковский написал panel.add(qdbs, c);

что неправильно, не так, никогда не делайте этого, вы забыли обернуть вас JTable в ScrollPane, а затем вы можете играть с некоторыми LayoutManagers, для соответствующих примеров для LayoutManagers проверьте GridBagConstraints для GrigBagLayout

Ответ 5

Следующий кадр будет правильно изменять размер таблицы при изменении размера кадра.

public class Sandbox {

public static void main(String[] args) {
    new TestFrame();
}

public static class TestFrame extends JFrame {
    public TestFrame() {
        this.setTitle("SSCCE");

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 0;

        c.insets = new Insets(10, 10, 10, 10);
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1;
        c.weighty = 1;
        JTable testTable = new JTable(10, 2);
        panel.add(testTable, c);

        this.add(panel);
        this.pack();
        this.setVisible(true);
    }
}

}

Ответ 6

Возможно, с помощью

GridBagConstraints.fill = GridBagContraints.BOTH;