Я пытаюсь настроить панель, которая будет содержать две разные таблицы, одна из которых составляет 1/3 ширины окна, а другая - 2/3 ширины окна. Вот демонстрационный код, который я тестировал:
import java.awt.*;
import javax.swing.*;
public class TableTest {
public static void main(String[] args)
{
JFrame frame = new JFrame("Test Frame");
frame.setTitle("Logged In");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 800);
frame.setLocationRelativeTo(null);
JPanel tablePanel = new JPanel(new GridBagLayout());
GridBagConstraints setup = new GridBagConstraints();
JTable table1 = new JTable();
table1.setFillsViewportHeight(true);
setup.fill = GridBagConstraints.BOTH;
setup.weightx = 0.5;
setup.weighty = 1;
setup.gridx = 0;
setup.insets = new Insets(10,10,10,5);
tablePanel.add(new JScrollPane(table1), setup);
JTable table2 = new JTable();
table2.setFillsViewportHeight(true);
setup.fill = GridBagConstraints.BOTH;
setup.weightx = 1;
setup.weighty = 1;
setup.gridx = 1;
setup.insets = new Insets(10,5,10,10);
tablePanel.add(new JScrollPane(table2), setup);
frame.add(tablePanel);
frame.pack();
frame.setVisible(true);
}
}
Если я использую JTextArea вместо JTable, я получаю правильный макет, две области, одна из которых составляет 1/3 ширины окна, а другая - 2/3 ширины. Когда я использую JTable, я получаю две области, каждая из которых составляет 1/2 ширины окна.
Некоторые из вещей, которые я пробовал:
- Установка ширины сетки на 1 и 2 соответственно
- Установка заливки по ВЕРТИКАЛИ
- Изменение весаx
После каждого изменения я все еще получаю две таблицы одинакового размера внутри окна.
Вещи, которые я не пробовал:
1. Новый макет. Я работаю с Swing около недели, поэтому, возможно, есть макет, отличный от GridBagLayout, который решает эту проблему, но моя относительная неопытность затрудняет его определение.
Кажется, что JScrollPane игнорирует мою настройку при использовании JTable, но я не уверен, правда ли это, и если да, то почему. Любая помощь в этом вопросе будет принята с благодарностью.
Вот изображение того, как я хочу, чтобы макет выглядел: Пример макета
ОБНОВЛЕНИЕ
После дальнейшего тестирования выяснилось, что проблема заключается в ширине окна. Если вы перетащите ширину окна ниже ~ 950, вы заметите, что макет «привязывается» к правильным пропорциям. Возможно, это намекает на виновного. Я не уверен, действует ли GridBagLayout по-разному при разной ширине окна, но я предположил, что он масштабируется одинаково при всех размерах, и это основная причина, по которой я его использовал.
frame.add(tablePanel); frame.setVisible(true);
Всегда должен бытьframe.pack()
после добавления последнего компонента и перед установкой видимого фрейма. Сомневаюсь, что именно здесь проблема, но убедитесь, что это сделано, чтобы устранить все сомнения. - person Andrew Thompson   schedule 21.11.2015