2012-12-09 48 views
5

我有一个JButton,我想扩展以填充保存它的JPanel的大小。我已经尝试了几种不同的方式,没有运气。这里有一些尝试:Java:展开JButton以填充容器

  1. 手动大小设置为推荐here - 按钮的大小没有改变。

    panel = new JPanel(new CardLayout()); 
    button = new JButton(); 
    button.setPreferredSize(new Dimension(BUTTON_SIZE, BUTTON_SIZE)); 
    panel.add(button); 
    
  2. 想使用BorderLayouthere暗示以展开按钮。大小没有改变。

    panel = new JPanel(new BorderLayout()); 
    button = new JButton(); 
    panel.add(button, BorderLayout.CENTER); 
    

我可能做一些错误的,所以任何的帮助深表感谢。

编辑

这里是什么解决的一个总结吧。有迹象表明,曾

  1. 卸下布局管理(在调用new JPanel)2周的事情,这according to Oracle默认为BorderLayout的。
  2. 按照接受的答案(即new BorderLayout(0,0))向呼叫添加维度。
+0

其实我们需要看到的是你用按钮'panel'做什么。理论上第二次尝试是正确的。 – MadProgrammer

回答

5

你的第二次尝试应该工作,但是,这并不意味着你的整个顶层容器将包含您的JButtonJPanel填充。当容器中没有其他组件时,中心组件将展开以填充整个容器。

http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

如果被放大的窗口,中心区域变得尽可能的可用空间。

您可以发布您在运行应用时看到的图片吗?下面是一个工作示例。值得注意的一件事是,每个容器一直到顶部JFrame也使用BorderLayout。在您尝试使用某些上层容器时,可能会限制您的尺寸JPanel,因此也会限制其中的JButton

frame = new JFrame(); 
frame.setBounds(100, 100, 450, 300); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel panel = new JPanel(); 
panel.setLayout(new BorderLayout(0, 0)); 
JButton button = new JButton("I'm a button!"); 
panel.add(button); 

frame.getContentPane().add(panel, BorderLayout.CENTER); 

enter image description here

+1

+1应该是。和很好的例子 –

3

似乎没什么问题使用BorderLayout时:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public Test() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(300, 300); 
      } 
     }; 
     panel.setLayout(new BorderLayout()); 

     JButton button = new JButton("Button"); 

     panel.add(button); 

     frame.add(panel); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 
} 

请张贴SSCCE显示具体问题。

+2

+1伟大的思想;) – MadProgrammer

+1

大卫,小费:使用alt + printScreeen获取*仅*活动应用程序的屏幕截图。你不认为我会去裁剪我张贴的那些图像的麻烦,是吗? ;)请参阅[如何创建屏幕截图?](http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post)以获取更多提示。 –

+1

@AndrewThompson @AndrewThompson谢谢你+1为我未来的帖子节省了我的时间;) –

4

BorderLayout是最简单的解决方案。

您可能遇到的问题是如何布置父面板。将该按钮添加到使用BorderLayout的面板,然后将面板添加到使用FlowLayout的面板不会产生您之后的效果。

enter image description here

public class ExpandButtonTest { 

    public static void main(String[] args) { 
     new ExpandButtonTest(); 
    } 

    public ExpandButtonTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JButton("I'm a big button")); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

+1很好呵呵:) –