2014-01-17 2 views
0

Я понимаю из этого сообщения 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())); 

enter image description here

+0

Попробуйте добавить что-то к ScrollPane, который реализует интерфейс 'Scrollable'. Это может повлиять на «видимый» размер scrollpane – MadProgrammer

+0

Я добавляю много текстовых полей, JList в JPanel, который затем добавляется в JScrollPane. Или вы говорите, что я должен сделать Jpanel, который добавляю к JScrollPane, прокручиваемому? Если да, то как мне реализовать методы прокрутки в JPanel? – sethu

+1

Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). –

ответ

0

я вывесил этот вопрос еще раз, так как это один был признан быть закрыты.Там я указал правильный ответ. Пожалуйста, проверьте ссылку ниже для ответа

Use the Bounds of the Screen minus Insets

0

«Сделать/JTabbedPane/JPanelInTab продлить ДО высоты экрана (принимая в панели задач Windows), если вкладка JFrame содержимое будет вырезано, полосы прокрутки должны появиться. Ширина кадра должна соответствовать точно такой же, как JTabbedPane ».

Для каждого JScrollPane, который держит каждую вкладку panbel, что вы хотите добавить к JTabbedPane, завернуть каждый в другом JPanel с BorderLayout. BorderLayout вызовет JScrollPane с, чтобы растянуть размер контейнера JTabbedPane, что в конечном итоге растягиваются до размера JFrame

// set tabbed panels to BorderLayout and add scrolls 
    panelTab1 = new JPanel(new BorderLayout()); 
    panelTab2 = new JPanel(new BorderLayout()); 
    panelTab1.add(panel1Scroll); 
    panelTab2.add(panel2Scroll); 

    // add panelTabs to tabbed pane 
    tabbedPane = new JTabbedPane(); 
    tabbedPane.add(panelTab1, "Panel 1"); 
    tabbedPane.add(panelTab2, "Panel 2"); 

Вы можете видеть, что я сделал то, что я описал в моем моем ответьте выше.

Вот бегущего пример

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

public class TabbedMaxSize { 
    JTabbedPane tabbedPane; 
    JPanel panelTab1; 
    JPanel panelTab2; 

    public TabbedMaxSize() { 
     // add label to first bos 
     Box box1 = Box.createVerticalBox(); 
     for (int i = 1; i <= 100; i++) { 
      box1.add(new JLabel("This is Label #" + i)); 
     } 

     // add labels to second box 
     Box box2 = Box.createVerticalBox(); 
     for (int i = 1; i <= 100; i++) { 
      box2.add(new JLabel("This is Label #" + i)); 
     } 

     // add boxes to panels and to scroll panes 
     JPanel boxPanel1 = new JPanel(); 
     JPanel boxPanel2 = new JPanel(); 
     boxPanel1.add(box1); 
     boxPanel2.add(box2); 
     JScrollPane panel1Scroll = new JScrollPane(boxPanel1); 
     JScrollPane panel2Scroll = new JScrollPane(boxPanel2); 

     // ser tabbed panels to BorderLayout and add scrolls 
     panelTab1 = new JPanel(new BorderLayout()); 
     panelTab2 = new JPanel(new BorderLayout()); 
     panelTab1.add(panel1Scroll); 
     panelTab2.add(panel2Scroll); 

     // add panelTabs to tabbed pane 
     tabbedPane = new JTabbedPane(); 
     tabbedPane.add(panelTab1, "Panel 1"); 
     tabbedPane.add(panelTab2, "Panel 2"); 


     JFrame frame = new JFrame(); 
     frame.add(tabbedPane); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       TabbedMaxSize gui = new TabbedMaxSize(); 
      } 
     }); 
    } 
} 

enter image description here

+0

Не могли бы вы проверить изображение, опубликованное выше. – sethu

+0

ok .. Я пропустил frame.setExtendedState (JFrame.MAXIMIZED_BOTH); в моем примере. Почему это так ведет себя? Только если я максимизирую оба, он будет уважать панель задач? – sethu

Смежные вопросы