2012-06-19 9 views
3

jpanel에 여러 jpanels를 추가하고 싶습니다. jscrollpane.ro에 루트 패널을 추가 한 다음 모든 루트 패널에 모든 개별 jpanels를 추가했습니다. 필요한 경우 jscrollpane의 스크롤 정책을 작성했습니다. HORIZONTAL_SCROLLBAR_AS_NEEDED, VERTICAL_SCROLLBAR_AS_NEEDED. 하지만 문제는 모든 개별 패널이 루트 패널 내부에 표시되지 않는다는 것입니다.모든 개별 패널이 루트 패널 내에 표시되지 않음

코드 : 내가 패널이 JScrollPane의 영역 밖으로 가고있는 스크롤 막대를 스크롤

JScrollPane scPanel=new JScrollPane(); 

JPanel rootPanel=new JPanel(); 
rootPanel.setLayout(new FlowLayout()); 

JPanel indPanel = new JPanel(); 
rootPanel.add(indPanel); 

JPanel indPanel2 = new JPanel(); 
rootPanel.add(indPanel2); 

//.....like this added indPanals to rootPanel. 
scPanel.setViewPortView(rootPanel); 
//scPanel.setHorizontalScrollPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED); 

그리고 한가지 더있다. 개별 패널을 모두 볼 수 없으므로 제안 해주세요.

편집 : 더블 포스트에서 코드 :

MosaicFilesStatusBean mosaicFilesStatusBean = new MosaicFilesStatusBean(); 
DefaultTableModel tableModel = null; 
tableModel = mosaicFilesStatusBean.getFilesStatusBetweenDates(startDate, endDate); 
if (tableModel != null) { 
    rootPanel.removeAll();   
    rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.PAGE_AXIS));  
    for (int tempRow = 0; tempRow < tableModel.getRowCount(); tempRow++) { 

     int fileIdTemp = Integer.parseInt(tableModel.getValueAt(tempRow, 0).toString()); 
     String dateFromTemp = tableModel.getValueAt(tempRow, 3).toString(); 
     String dateToTemp = tableModel.getValueAt(tempRow, 4).toString(); 
     int processIdTemp = Integer.parseInt(tableModel.getValueAt(tempRow, 5).toString()); 
     int statusIdTemp = Integer.parseInt(tableModel.getValueAt(tempRow, 6).toString()); 
     String operatingDateTemp = tableModel.getValueAt(tempRow, 7).toString();     
     MosaicPanel tempPanel =   
      new MosaicPanel(fileIdTemp, dateFromTemp, dateToTemp, processIdTemp, statusIdTemp, operatingDateTemp);    
     rootPanel.add(tempPanel);    
    } 
    rootPanel.revalidate(); 
} 
+0

내 대답을 편집하십시오를 참조하십시오. –

답변

3

당신이 당신의 JPanel 당신이 rootPanel에 대한 LayoutManagerFlowLayout을 사용하는 것입니다 볼 수없는 주된 이유. 그리고이 rootPanel에 추가 된 JPanel에는 아무 것도 없으므로 너비와 높이가 각각 0, 0 인 크기가됩니다. 이러한 상황을 사용해서는 안되지만 GridLayout입니다. 다음 코드 예제를 첨부하여 살펴보십시오.

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

public class PanelAddition 
{ 
    private void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("Panel Addition Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new GridLayout(0, 1));   
     JScrollPane scroller = new JScrollPane(); 

     CustomPanel panel = new CustomPanel(1); 
     contentPane.add(panel); 
     scroller.setViewportView(contentPane); 
     frame.getContentPane().add(scroller, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

     for (int i = 2; i < 20; i++) 
     { 
      CustomPanel pane = new CustomPanel(i); 
      contentPane.add(pane); 
      contentPane.revalidate(); 
      contentPane.repaint(); 
     } 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new PanelAddition().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class CustomPanel extends JPanel 
{ 

    public CustomPanel(int num) 
    { 
     JLabel label = new JLabel("" + num); 
     add(label); 
    } 

    @Override 
    public Dimension getPreferredSize() 
    { 
     return (new Dimension(200, 50)); 
    } 
} 
+0

1+ 괜찮은 [SSCCE] (http://SSCCE.org)를 보여주었습니다. –

+0

정말 감사합니다. 도움을 요청 해 주셔서 감사합니다. 실제로 문제는 내가 rootpanel.repaint()를 작성하지 않았기 때문에 패널이 페인트되지 않습니다. –

+0

Ahha, 예 때때로 필요합니다 :-), 나머지는, 당신은 가장 환영 받고 있습니다 .--),이 대답을 알게되어서 어딘가 도움이되었습니다 :-) –

3

가 인 RootPanel에 대한 FlowLayout에 사용하지 마십시오. 대신 BoxLayout 사용을 고려 :

JPanel rootPanel=new JPanel(); 
// if you want to stack JPanels vertically: 
rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.PAGE_AXIS)); 

편집 여기에 1
게시 느슨하게 최신 코드 기반으로 SSCCE의 : 점에서 쉽게 JPanel의를 제거하고 추가 보여줍니다

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.util.Random; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class PanelsEg extends JPanel { 
    private static final int MAX_ROW_COUNT = 100; 
    private Random random = new Random(); 
    private JPanel rootPanel = new JPanel(); 

    public PanelsEg() { 
     rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.PAGE_AXIS)); 
     JScrollPane scrollPane = new JScrollPane(rootPanel); 
     scrollPane.setPreferredSize(new Dimension(400, 400)); // sorry kleopatra 

     add(scrollPane); 

     add(new JButton(new AbstractAction("Foo") { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      foo(); 
     } 
     })); 
    } 

    public void foo() { 
      rootPanel.removeAll();   
      // rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.PAGE_AXIS)); // only need to set layout once 
      int rowCount = random.nextInt(MAX_ROW_COUNT); 
     for (int tempRow = 0; tempRow < rowCount ; tempRow++) { 

       int fileIdTemp = tempRow; 
       String data = "Data " + (tempRow + 1); 
       MosaicPanel tempPanel =   
       new MosaicPanel(fileIdTemp, data);    
       rootPanel.add(tempPanel);    
      } 
      rootPanel.revalidate(); 
      rootPanel.repaint(); // don't forget to repaint if removing 
    } 

    private class MosaicPanel extends JPanel { 

     public MosaicPanel(int fileIdTemp, String data) { 
     add(new JLabel(data)); 
     } 

    } 

    private static void createAndShowGui() { 
     PanelsEg mainPanel = new PanelsEg(); 

     JFrame frame = new JFrame("PanelsEg"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

이 SSCCE 작품 JScrollPane에 의해 보관 유지되는 다른 JPanel에 전송합니다. 그래도 문제가 발생하면이 SSCCE를 수정하여 문제가 표시되도록해야합니다.