2011-08-04 2 views
1

내 코드는 JPanel 세 개의 접을 수있는 JPanel이 있습니다. 바깥 쪽 JPanelBoxLayout을 사용하여 세로 3자를 세로로 쌓습니다. 그러나 JPanel을 접을 때 상단 JPanel은 항상 그 범위를 채우기 위해 확장됩니다 (심지어 setMaximumSize() 또는 그럴 경우에도). 반면 하단의 JPanel을 위쪽으로 확장하려고합니다. 그것은 일반적으로 결함이 있습니다. 나는 GridBagLayout을보고 있었는데, 이런 종류의 노력에 더 적합할까요?접을 수있는 JPanels가있는 컨테이너의 기본 레이아웃 관리자는 무엇입니까

감사합니다.

http://www.codeproject.com/KB/cpp/CollapsiblePanelVB.aspx

+0

내가 재 검증 '에 전화를 볼 수 없습니다 GridBagLayout()'를 기반으로. – trashgod

+1

코드가 전혀 표시되지 않습니다. @ 농장 타조, 그건 당신의 신호가 일부 코드를 제공했다. – mre

+0

나 앞에 펼쳐진 500 줄의 쓰레기에서 편집 가능한 발췌 문장을 잘라내는 데 영원히 걸릴 것입니다. 내가 묻는 것 같아요 ... 이런 식으로 들어가고, 레이아웃을 어떻게 사용할 수 있을까요? –

답변

2

접을 수있는 패널이 무엇인지 알 수 없습니다. 그것은 0까지 계속 축소 되었습니까? 아니면 최소 높이가 있습니까?

항상 최대 크기를 관리하여 원하는 크기와 같으면 BoxLayout을 사용할 수 있어야합니다. 그냥 접착제를 사용하여 여분의 공간을 사용할 수 있도록 패널 하단에

panel.add(Box.createVerticalGlue()); 

을 사용하십시오.

내 앞에 펼쳐진 500 줄의 쓰레기 중에서 편집 가능한 스 니펫을 잘라내는 데 영원히 걸릴 것입니다.

이것이 SSCCE를 만들고 가비지 코드를 잊어 버린 이유입니다. 필요한 것은 접을 수있는 패널이 3 개인 패널입니다. 그런 다음 패널을 축소하고 어떤 일이 발생하는지 볼 수있는 버튼을 추가합니다. 데모 코드로 시작하는 것이 더 좋으며 500 줄의 코드를 작성하고 작동하지 않는다는 것을 알 수 있습니다.

+0

당신이 옳다고 생각합니다. 나는 약간의 유산 코드에 대해 연구하고있다. 처음부터 시작하는 시간. –

2

난 강력하게 MigLayout을 제안 :

이것은 내가 나의 거칠은 꿈 (제목 "수직 패널"을 이미지)에 대한 꿈을 무엇을 VB의 이미지입니다. 매우 강력하고 사용하기가 쉽습니다. 또한 널리 사용됩니다.

2

또는 오래된 고전은

enter image description hereenter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.awt.font.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class ExpansiblePanel { 

    public static void main(String[] args) { 
     CollapsablePanel cp = new CollapsablePanel("test", buildPanel()); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JScrollPane(cp)); 
     f.setPreferredSize(new Dimension(360, 200)); 
     f.setLocation(150, 150); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static JPanel buildPanel() { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.insets = new Insets(2, 1, 2, 1); 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     JPanel p1 = new JPanel(new GridBagLayout()); 
     gbc.gridwidth = GridBagConstraints.RELATIVE; 
     p1.add(new JButton("button 1"), gbc); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     p1.add(new JButton("button 2"), gbc); 
     gbc.gridwidth = GridBagConstraints.RELATIVE; 
     p1.add(new JButton("button 3"), gbc); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     p1.add(new JButton("button 4"), gbc); 
     p1.setBackground(Color.blue); 
     return p1; 
    } 

    private ExpansiblePanel() { 
    } 
} 

class CollapsablePanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private boolean selected; 
    private JPanel contentPanel_; 
    private HeaderPanel headerPanel_; 

    private class HeaderPanel extends JPanel implements MouseListener { 

     private static final long serialVersionUID = 1L; 
     private String text_; 
     private Font font; 
     private BufferedImage open, closed; 
     final int OFFSET = 30, PAD = 5; 

     HeaderPanel(String text) { 
      addMouseListener(this); 
      text_ = text; 
      font = new Font("sans-serif", Font.PLAIN + Font.BOLD, 12); 
      // setRequestFocusEnabled(true); 
      setPreferredSize(new Dimension(200, 25)); 
      setBackground(Color.black); 
      setForeground(Color.red); 
      int w = getWidth(); 
      int h = getHeight(); 
      /*try { 
      open = ImageIO.read(new File("images/arrow_down_mini.png")); 
      closed = ImageIO.read(new File("images/arrow_right_mini.png")); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      }*/ 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      int h = getHeight(); 
      /*if (selected) 
      g2.drawImage(open, PAD, 0, h, h, this); 
      else 
      g2.drawImage(closed, PAD, 0, h, h, this); 
      */ // Uncomment once you have your own images 
      g2.setFont(font); 
      FontRenderContext frc = g2.getFontRenderContext(); 
      LineMetrics lm = font.getLineMetrics(text_, frc); 
      float height = lm.getAscent() + lm.getDescent(); 
      float x = OFFSET; 
      float y = (h + height)/2 - lm.getDescent(); 
      g2.drawString(text_, x, y); 
     } 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      toggleSelection(); 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     } 
    } 

    CollapsablePanel(String text, JPanel panel) { 
     super(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.insets = new Insets(1, 3, 0, 3); 
     gbc.weightx = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     selected = false; 
     headerPanel_ = new HeaderPanel(text); 
     setBackground(Color.orange); 
     contentPanel_ = panel; 
     add(headerPanel_, gbc); 
     add(contentPanel_, gbc); 
     contentPanel_.setVisible(false); 
     JLabel padding = new JLabel(); 
     gbc.weighty = 1.0; 
     add(padding, gbc); 
    } 

    public void toggleSelection() { 
     selected = !selected; 
     if (contentPanel_.isShowing()) { 
      contentPanel_.setVisible(false); 
     } else { 
      contentPanel_.setVisible(true); 
     } 
     revalidate(); 
     headerPanel_.repaint(); 
    } 
} 
+0

+1 또한, 'MouseListener'대신 'Mouseadapter'를 사용하여 컴포지션을 고려하십시오. 일부 식별자에서 후행 "_"의 의미는 무엇입니까? – trashgod

+1

@trashgod, 나는 코드를 똑같이/비슷하게 만들었고, 오래된 PL의 나쁜 습관들도 썼다. – mKorbel

관련 문제