2011-11-30 82 views
1

我有一个问题。Java网格布局和JPanel

我有以下程序,我遇到了一件事情的麻烦。我已经创建了一个网格布局,并且我使用JPanel在网格中输入按钮和文本,但是如果我的文本很长,一切似乎都会改变大小。有人可以帮助我如何防止这种情况发生?

这是我的代码:

package JFrameTester; 

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



public class JFrameTester { 


public JPanel createContentPane(){ 

     JPanel panel = new JPanel(); 
     JButton button1,button2,button3,button4; 

     JPanel mainPanel = new JPanel(new GridLayout(2, 0, 40, 10)); 

     //JPanel red = createSquareJPanel(Color.red, 50); 
     button1 = new JButton ("button1"); 
     button2 = new JButton ("button2"); 
     button3 = new JButton ("button3"); 
     button4 = new JButton ("button4"); 
     Label one = new Label("Rohihtjthjhtjghjghmgfjgjghjghj"); 
     //add(button1); 


     mainPanel.add(button1); 
     mainPanel.add(one); 
     mainPanel.add(button2); 
     mainPanel.add(button3); 
     mainPanel.add(button4); 


     panel.add(mainPanel); 
     panel.setOpaque(true); 
     return panel; 
    } 


    public static void main(String[] args) { 

     JFrame frame = new JFrame("GridLayout"); 
     JFrameTester Display = new JFrameTester(); 
     frame.setContentPane(Display.createContentPane()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 


} 
} 

回答

4

这就是布局管理器做的;他们为每个组件分配足够的空间。您可以尝试将HTML嵌入到JLabel实例中以便进行换行。否则,你只能忍受它。

请注意,默认情况下JPanel实例不透明也很重要。

1

那么......首先要做的第一件事。你声明了2行0列的GridLayout。这正是你想要的吗?我想不是。

下一部分是您添加内容的位置。网格通常保持动态大小。它会缩小细胞到尽可能最小的值。但是当一些内容变大(文本的大jPanels)时,它会扩展单元格。

根据单元格的内容,它们将保持静态或试图填充所有可用空间。

如果我正确地阅读你的问题,你想要做的是通过使用JComponentsSee JavaDoc link here的功能为你的JButtons设置一个静态大小。您可能想要为每个按钮使用setMaximumSize(new Dimension(width,height));

有意义吗?

在侧面说明。如果您想更好地控制您的布局,请使用GrabBagLayout。更多的工作,但更多的控制。

+2

如果@Led k组的'JLabel'实例的最大尺寸(这是给他悲伤的成分),它的一些文本将丢失。 – mre

+1

不应该是'GridBagLayout'吗? –

+0

仍然无法让它工作:) – Led

0

这是一个较旧的帖子,但我只是偶然发现了这一点,而搜索同一问题。使用frame.pack()用于移动所有内容以适合给定的面板大小。所以如果你增加一件东西的尺寸,其他东西会缩小并移动以适应面板。

来源:http://www.macs.hw.ac.uk/guidebook/?name=JFrame&page=2