2017-12-10 103 views
0

이 코드를 사용하면 JScrollPane 안에 버튼을 쉽게 만들 수 있습니다. 나는 스크롤 창을 사용했는데, 장래에 버튼이 많을 것이기 때문입니다.JScrollPane의 JPanel 위치

버튼이있는 경우에만 JPanel이 표시되며, 스크롤 창 가운데에 표시됩니다. 대신 상단에 표시되어야합니다.

할 수 있습니까? 뱀장어 응답의 호버 전체를 기반으로 편집

JPanel pane = new JPanel(new GridBagLayout()); 

JButton button; 
pane.setLayout(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 
c.fill = GridBagConstraints.HORIZONTAL; 

button = new JButton("Button 1"); 
c.weightx = 0.5; 
c.gridx = 0; 
c.gridy = 0; 
pane.add(button, c); 

button = new JButton("Button 2"); 
c.gridx = 0; 
c.gridy = 1; 
pane.add(button, c); 

button = new JButton("Button 3"); 
c.gridx = 1; 
c.gridy = 1; 
pane.add(button, c); 

button = new JButton("Long-Named Button 4"); 
c.ipady = 40;  
c.weightx = 0.0; 
c.gridwidth = 3; 
c.gridx = 0; 
c.gridy = 2; 
pane.add(button, c); 

jScrollPane2.setViewportView(pane); 

enter image description here

내가 여러 JPanel의에 대한 생 코드를 생성하지만, JPanel의 볼 수평이 아닌 수직으로 위치 :

JPanel pane = new JPanel(new GridBagLayout()); 
     for (int i = 0; i < 100; i++) { 

      JButton button; 
      pane.setLayout(new GridBagLayout()); 
      GridBagConstraints c = new GridBagConstraints(); 
      c.fill = GridBagConstraints.HORIZONTAL; 

      button = new JButton("Button 1"); 
      c.weightx = 0.5; 
      c.gridx = 0; 
      c.gridy = 0; 
      pane.add(button, c); 

      button = new JButton("Button 2"); 
      c.gridx = 0; 
      c.gridy = 1; 
      pane.add(button, c); 

      button = new JButton("Button 3"); 
      c.gridx = 1; 
      c.gridy = 1; 
      pane.add(button, c); 

      button = new JButton("Long-Named Button 4"); 
      c.ipady = 40; 
      c.weightx = 0.0; 
      c.gridwidth = 2; 
      c.gridx = 0; 
      c.gridy = 2; 
      pane.add(button, c); 

     } 
     JPanel borderLayoutPanel = new JPanel(new BorderLayout()); // wrapper JPanel 
     borderLayoutPanel.add(pane, BorderLayout.PAGE_START); // add pane to the top 

     jScrollPane2.setViewportView(borderLayoutPanel); 

enter image description here

+0

'c.gridwidth = 3;'논리가 무엇입니까? 나는'c.gridwidth = 2; '가 더 적절하다고 생각했을 것이다. BTW -보다 나은 도움을 받으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. –

답변

1

새 "래퍼"JPanel 만들기 , BorderLayout을 사용하는 래퍼, 래퍼 JPanel의 BorderLayout.PAGE_START 위치에 창을 추가 한 다음 JprollPane의 뷰포트에 동일한 래퍼 JPanel을 추가하십시오. 예를 들어 작업 MCVE의 예를 들어

JPanel borderLayoutPanel = new JPanel(new BorderLayout()); // wrapper JPanel 
borderLayoutPanel.add(pane, BorderLayout.PAGE_START); // add pane to the top 
jScrollPane2.setViewportView(borderLayoutPanel); // add wrapper to viewport 

, 확인하시기 바랍니다 :

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

@SuppressWarnings("serial") 
public class Foo extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = 600; 
    private JPanel gridPanel = new JPanel(new GridLayout(0, 1)); 
    public Foo() { 
     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(new JButton(new AbstractAction("Add Panel") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       gridPanel.add(createButtonPanel()); 
       gridPanel.revalidate(); 
       gridPanel.repaint(); 
      } 
     })); 

     JPanel borderLayoutPanel = new JPanel(new BorderLayout()); 
     borderLayoutPanel.add(gridPanel, BorderLayout.PAGE_START); 
     JScrollPane scrollPane = new JScrollPane(borderLayoutPanel); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     setPreferredSize(new Dimension(PREF_W, PREF_H)); 
     setLayout(new BorderLayout()); 
     add(scrollPane); 
     add(buttonPanel, BorderLayout.PAGE_END); 
    } 

    private JPanel createButtonPanel() { 
     JPanel pane = new JPanel(new GridBagLayout()); 
     pane.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 

     JButton button; 
     pane.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.anchor = GridBagConstraints.PAGE_START; 

     button = new JButton("Button 1"); 
     c.weightx = 0.5; 
     c.gridx = 0; 
     c.gridy = 0; 
     pane.add(button, c); 

     button = new JButton("Button 2"); 
     c.gridx = 0; 
     c.gridy = 1; 
     pane.add(button, c); 

     button = new JButton("Button 3"); 
     c.gridx = 1; 
     c.gridy = 1; 
     pane.add(button, c); 

     button = new JButton("Long-Named Button 4"); 
     c.ipady = 40;  
     c.weightx = 0.0; 
     c.gridwidth = 3; 
     c.gridx = 0; 
     c.gridy = 2; 
     pane.add(button, c); 
     return pane; 
    } 

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

     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

내 편집 된 게시물을 참조하십시오. – user2847219

+0

@ user2847219 : Andrew Thompson이 제안했듯이 여전히 문제가있는 경우 질문을 수정하고 적합한 [mcve], * 작은 * 독립 실행 형 프로그램을 게시하십시오. 코드 형식의 텍스트로서 질문을 컴파일하고 실행하여 문제를 보여줍니다. –

+0

@ user2847219 : * * * JPanels? 게시 된 코드에 여러 가로 JPanel을 표시하지 않습니다. 다시 한 번 괜찮은 MCVE가 우리에게 대답 할 것입니다. –