簡體   English   中英

Java:展開JButton以填充Container

[英]Java: Expand JButton to fill Container

我有一個JButton ,我想擴展以填充持有它的JPanel的大小。 我嘗試過幾種不同的方式,沒有運氣。 以下是一些嘗試:

  1. 這里推薦的手動尺寸設置 - 按鈕尺寸沒有變化。

     panel = new JPanel(new CardLayout()); button = new JButton(); button.setPreferredSize(new Dimension(BUTTON_SIZE, BUTTON_SIZE)); panel.add(button); 
  2. 試圖用一個BorderLayout是在暗示,擴大按鈕在這里 尺寸沒有變化。

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

我可能做錯了什么,所以非常感謝任何幫助。

編輯

以下是解決問題的摘要。 有兩件事有效

  1. 刪除LayoutManager(在對new JPanel的調用中), 根據Oracle默認為BorderLayout。
  2. 在接受的答案中添加維度(即new BorderLayout(0,0) )。

您的第二次嘗試應該有效,但這並不意味着您的整個頂級容器將由包含您的JButtonJPanel填充。 如果BorderLayout容器中沒有其他組件,則中心組件將展開以填充整個容器。

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);

在此輸入圖像描述

BorderLayout是最簡單的解決方案。

您可能遇到的問題是如何布置父面板。 將按鈕添加到使用BorderLayout的面板,然后將面板添加到使用FlowLayout的面板將不會產生您所追求的效果。

在此輸入圖像描述

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);
            }
        });
    }

}

使用BorderLayout時對我來說似乎很好:

在此輸入圖像描述

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以顯示具體問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM