Я понимаю из этого сообщения Don't Set sizes on a JComponent, что вы не задаете предпочтительные размеры на любом компоненте, а вместо этого пусть менеджер компоновки сделает это за вас.Определение размера JScrollPane в JTabbedPane в JFrame
Мой вопрос, у меня есть JPanel, что я положил в JTabbedPane в JFrame как этот
JFrame frame=new JFrame();
JTabbedPane pane=new JTabbedPane();
pane.addTab("Tab 1",new JScrollPane(getJPanel1()));
pane.addTab("Tab 2",new JScrollPane(getJPanel2()));
frame.setContentPane(pane);
Теперь в этом случае JTabbedPane примет размер максимального размера компонента, добавляемого к нему. Из-за этого мой JScrollPane не появляется вообще. Мне нужно установить предпочтительный размер JScrollPane, если я его не установлю, полосы прокрутки не будут отображаться, а содержимое будет сокращено.
Как использовать диспетчер компоновки для решения этой проблемы. Я хочу конкретно сделать это:
Сделайте JFrame/JTabbedPane/JPanelInTab доверху до высоты экрана (принимая в панель задач окна), если содержимое вкладки будет обрезано, появятся полосы прокрутки. Ширина рамки должна соответствовать точно такой же, как JTabbedPane.
EDIT
Вот MVCE, который показывает, что я пытаюсь сделать. Я включил изменения в соответствии с предложением peeskillet, но нет никакого эффекта
import javax.swing.*;
import java.awt.*;
public class ScrollPaneTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
JTabbedPane tabbedPane=new JTabbedPane();
tabbedPane.addTab("Tab 1", wrapWithBorderLayoutPanel(getPanel()));
tabbedPane.addTab("Tab 2", wrapWithBorderLayoutPanel(getPanel()));
//
// tabbedPane.addTab("Tab 1", new JScrollPane(getPanel()));
// tabbedPane.addTab("Tab 2", new JScrollPane(getPanel()));
frame.setContentPane(tabbedPane);
frame.pack();
frame.setVisible(true);
}
private JPanel wrapWithBorderLayoutPanel(JPanel panel) {
JPanel borderLayoutPanel=new JPanel(new BorderLayout());
borderLayoutPanel.add(new JScrollPane(panel), BorderLayout.CENTER);
return borderLayoutPanel;
}
private JPanel getPanel() {
JPanel panel=new JPanel();
Box box = Box.createVerticalBox();
for (int i = 1; i <= 100; i++) {
box.add(new JLabel("This is Label #" + i));
}
panel.add(box);
return panel;
}
});
}
}
После того, как я, что ниже на выходе я получаю. Рамка не заканчивается на панели задач. Он тянется за ним. Таким образом, последняя метка скрыта за панелью задач. Я хотел бы, чтобы кадр закончился до начала панели задач.
PS: Нет никаких изменений, если я обернуваю панель панелью BorderLayout или добавлю панель прокрутки непосредственно на панель с вкладками. Оба результата в одном и том же. Вы можете проверить то же комментированием строки
//tabbedPane.addTab("Tab 1", wrapWithBorderLayoutPanel(getPanel()));
//tabbedPane.addTab("Tab 2", wrapWithBorderLayoutPanel(getPanel()));
tabbedPane.addTab("Tab 1", new JScrollPane(getPanel()));
tabbedPane.addTab("Tab 2", new JScrollPane(getPanel()));
Попробуйте добавить что-то к ScrollPane, который реализует интерфейс 'Scrollable'. Это может повлиять на «видимый» размер scrollpane – MadProgrammer
Я добавляю много текстовых полей, JList в JPanel, который затем добавляется в JScrollPane. Или вы говорите, что я должен сделать Jpanel, который добавляю к JScrollPane, прокручиваемому? Если да, то как мне реализовать методы прокрутки в JPanel? – sethu
Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). –