2011-10-26 44 views
5

我需要在JPanel中显示单个组件,并且我希望始终保持该组件位于右下角。我试着用GridBagLayout的做到这一点:如何使用GridBagLayout将组件放在右下角?

val infoArea = new TextArea { 
    text = "Hello!" 
    border = Swing.EmptyBorder(30) 
    background = Color.RED 
    editable = false 
} 
val p = new JPanel 
p.setLayout(new GridBagLayout) 
val c = new GridBagConstraints 
c.gridx = 0 
c.gridy = 0 
c.anchor = GridBagConstraints.LAST_LINE_END 
p.add(infoArea.peer,c) 
val f = new JFrame 
f.setContentPane(p) 
f.setVisible(true) 

但文本区域在中心由于某些原因:

enter image description here

我在做什么错在这里?

+0

你没有看过它出现在GridBagLayout的教程由代码(添加只有一个组件,并且不添加一些虚拟组件来填充JPanel,放置东西gridx和gridy 0,没有设置所有相关的GridBagConstraints ...),你不能指望任何东西复杂的工作没有先学习。无论如何,我会使用更简单的布局(如BorderLayouts)来使用嵌套的JPanel。 –

+0

@HovercraftFullOfEels - 我预计只有一个单元格,并将组件放置在右下角(通过设置锚点约束)。还有什么其他的限制是相关的? – Rogach

+0

weightx,重量之一,但无论如何,如果只添加一个组件,则无法使用GridBagLayout完成。再次,嵌套JPanel每个与它自己的布局。再次,BorderLayout将工作得很好。 –

回答

5
final JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
frame.setLayout(new GridBagLayout()); 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.fill = GridBagConstraints.BOTH; 
gbc.weightx = 1.0; 
gbc.weighty = 1.0; 
frame.add(Box.createGlue(), gbc); 

final JTextArea textArea = new JTextArea("SE"); 
textArea.setPreferredSize(new Dimension(50, 50)); 
textArea.setOpaque(true); 
textArea.setBackground(Color.RED); 
gbc = new GridBagConstraints(); 
gbc.gridx = 1; 
gbc.gridy = 1; 
gbc.fill = GridBagConstraints.NONE; 
gbc.weightx = 0.0; 
gbc.weighty = 0.0; 
frame.add(textArea, gbc); 

frame.setSize(640, 480); 
frame.setVisible(true); 

...如果你真的想用GridBagLayout的

+1

是的,你用Box的“胶水”作为你的虚拟组件。做得好,还有1+。 –

+0

这对我更好。出于某种原因,当我使用两个边界布局时,主面板的整个右侧部分被涂成灰色。 – Rogach

8

例如:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.*; 

public class LayoutDemo { 
    private static void createAndShowGui() { 
     JLabel label = new JLabel("Hello"); 
     label.setOpaque(true); 
     label.setBackground(Color.red); 

     JPanel bottomPanel = new JPanel(new BorderLayout()); 
     bottomPanel.add(label, BorderLayout.LINE_END); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     mainPanel.add(bottomPanel, BorderLayout.PAGE_END); 
     mainPanel.setPreferredSize(new Dimension(400, 400)); 


     JFrame frame = new JFrame("LayoutDemo"); 
     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(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

enter image description here

相关问题