Java 可调整大小的Swing布局,带有根据可变尺寸排列的按钮

Java 可调整大小的Swing布局,带有根据可变尺寸排列的按钮,java,swing,layout-manager,Java,Swing,Layout Manager,我想用JavaSwing做一个布局,它看起来像下图 (来源:) 左边是一个JPanel,它是通过paintComponent()绘制的,在调整窗口大小时,图形会自动缩放。(问题不在于那个小组,那个小组已经完成了。) 现在我需要在前面提到的JPanel右侧添加一些按钮(在Photoshop中为绘图添加的黑框)。顶部和底部略带红色区域的高度(旁边应该只有空白)是沿着常量系数*getHeight()行计算的。在左侧的每个隔间旁边,应该有一组按钮,排列到相应隔间的中心(参见蓝线) 包含按钮的JPane

我想用JavaSwing做一个布局,它看起来像下图


(来源:)

左边是一个JPanel,它是通过
paintComponent()
绘制的,在调整窗口大小时,图形会自动缩放。(问题不在于那个小组,那个小组已经完成了。)

现在我需要在前面提到的JPanel右侧添加一些按钮(在Photoshop中为绘图添加的黑框)。顶部和底部略带红色区域的高度(旁边应该只有空白)是沿着
常量系数*getHeight()
行计算的。在左侧的每个隔间旁边,应该有一组按钮,排列到相应隔间的中心(参见蓝线)

包含按钮的JPanel知道常量_因子和隔室数,因此应该可以将此信息输入布局管理器


我最好使用哪个布局管理器来实现此布局?我已经阅读了所有不同的布局管理器,但我不太清楚哪一个或哪一个组合最适合这种情况。

例如,通过使用不同的、非常简单的容器,只需15-20分钟:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ThinLineFrame {
    private JFrame frame = new JFrame();
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private JPanel panelNorth = new JPanel();
    private JPanel panelCenter = new JPanel();
    private JPanel panelCenterCh1 = new JPanel();
    private JPanel panelCenterCh2 = new JPanel();
    private JPanel panelCenterCh3 = new JPanel();
    private JPanel panelCenterCh4 = new JPanel();
    private JPanel panelCenterCh5 = new JPanel();
    private JPanel panelSouth = new JPanel();

    public ThinLineFrame() {
        panelNorth.setBackground(Color.red.darker());
        panelNorth.setPreferredSize(new Dimension(80, 30));
        //
        panelCenter.setBackground(Color.darkGray);
        panelCenter.setLayout(new GridLayout(5, 1, 2, 2));
        //
        panelCenterCh1.setLayout(new BorderLayout());
        JButton panelCenterCh1Button = new JButton();
        panelCenterCh1.add(panelCenterCh1Button, BorderLayout.CENTER);
        //
        JButton panelCenterCh2Button1 = new JButton();
        JButton panelCenterCh2Button2 = new JButton();
        panelCenterCh2.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh2.add(panelCenterCh2Button1);
        panelCenterCh2.add(panelCenterCh2Button2);
        //
        JButton panelCenterCh3Button1 = new JButton();
        JButton panelCenterCh3Button2 = new JButton();
        panelCenterCh3.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh3.add(panelCenterCh3Button1);
        panelCenterCh3.add(panelCenterCh3Button2);
        //
        JButton panelCenterCh4Button1 = new JButton();
        JButton panelCenterCh4Button2 = new JButton();
        panelCenterCh4.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh4.add(panelCenterCh4Button1);
        panelCenterCh4.add(panelCenterCh4Button2);
        //
        panelCenterCh5.setLayout(new BorderLayout());
        JButton panelCenterCh5Button = new JButton();
        panelCenterCh5.add(panelCenterCh5Button, BorderLayout.CENTER);
        //
        panelCenter.add(panelCenterCh1);
        panelCenter.add(panelCenterCh2);
        panelCenter.add(panelCenterCh3);
        panelCenter.add(panelCenterCh4);
        panelCenter.add(panelCenterCh5);
        //
        panelSouth.setBackground(Color.red.darker());
        panelSouth.setPreferredSize(new Dimension(80, 30));
        //
        panel.setLayout(new BorderLayout(2, 2));
        panel.add(panelNorth, BorderLayout.NORTH);
        panel.add(panelCenter, BorderLayout.CENTER);
        panel.add(panelSouth, BorderLayout.SOUTH);
        //
        scrollPane = new JScrollPane(panel);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(80, 600));
        frame.setLocation(100, 150);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ThinLineFrame dlg = new ThinLineFrame();
            }
        });
    }
}

你应该试着看看布局。这是一个超级灵活的布局管理器,也非常简单

代码将类似于:

MigLayout layout = new MigLayout("flowy");
panel.setLayoutManager(layout);
panel.add(button1);
panel.adD(button2);
etc..

尝试将debug、
flowy
添加到构造函数中,以直观地了解正在进行的操作。

GBC不带锚,只带简单的约束和首选大小

固定大小的居中按钮:

import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MainWithFixSize {
    public static void main(String[] argv) throws Exception {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        GridBagLayout gbl = new GridBagLayout();
        container.setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 1;
        JButton component = new JButton();
        component.setPreferredSize(new Dimension(25, 25));
        gbl.setConstraints(component, gbc);
        container.add(component);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(40, 90));
        frame.pack();
        frame.setVisible(true);
    }

    private MainWithFixSize() {
    }
}

+好的。我实际上也在写我的答案,但我对“你能@mKorbel做点什么吗?”感到恼火。谢谢。不过,我的主要问题仍未解决。1.我如何使按钮的大小固定,比如25x25,并且保持隔间大小不变?button.setSize(25,25)完全没有效果。2.例如,如何将红色区域的高度设置为
0.05*frame.getHeight()
?如果我在构造器中这样做,在调整窗口大小时,红色区域将不会被调整大小。同意,那么最简单的方法是使用Grigbagalout(用于childs JPanels)并检查此示例,了解如何使用约束在JPanel中真正坚持(f.e JButton)。锚=GridBagConstraints.CENTER;你是说在每个隔间旁边放一个单独的JPanel,然后把按钮放进去?我将如何继续使红色区域在高度上具有灵活性,但具有确定的比例(即整个面板高度的1/10?啊,好吧,忽略最后的评论,那是胡说八道。我现在正试图用GridBagLayout替换最外面的边框布局。但是它根本不起作用。有什么建议吗?我能告诉MigLayout将button1例如0.05倍于button2,以便在调整窗口大小时也保持此比率吗?是的您可以。您可以设置相对于其他组件位置的位置。我已经有一段时间没有接触到Swing代码了,但这绝对是可能的,而且非常简单。请查看MigLayout cheat以了解其确切细节