按边缘排列摆动组件

Posted

技术标签:

【中文标题】按边缘排列摆动组件【英文标题】:Line up swing components by edges 【发布时间】:2012-10-29 09:03:35 【问题描述】:

是否可以排列摆动组件? 这些组件位于单独的面板中,它们都使用流布局。这两个面板位于另一个使用网格布局的面板中。

如您所见,存在细微差别,我觉得这很烦人。我知道所有的 jlabels [蓝色/紫色的矩形都具有相同的大小,所以我认为这可能是因为“+”和“*”,但我不确定因为第一个的左侧两个盒子没有排成一行。

面板

JPanel panel2 = new JPanel(new GridLayout(4, 1));
JPanel panel2a = new JPanel(new FlowLayout());
JPanel panel2b = new JPanel(new FlowLayout());

前两个矩形(紫色)

add1 = new JLabel("", JLabel.CENTER);
add1.setTransferHandler(new TransferHandler("text"));
add1.setBorder(b2);
add2 = new JLabel("", JLabel.CENTER);
add2.setTransferHandler(new TransferHandler("text"));
add2.setBorder(b2);

两个蓝色矩形

textFieldA = new JTextField();
textFieldA.setHorizontalAlignment(JTextField.CENTER);
textFieldA.setEditable(false);
textFieldA.setBorder(new LineBorder(Color.blue));
textFieldM = new JTextField();
textFieldM.setHorizontalAlignment(JTextField.CENTER);
textFieldM.setEditable(false);
textFieldM.setBorder(new LineBorder(Color.blue));

+ 和 *

opA = new JLabel("+", JLabel.CENTER);
opS = new JLabel("*", JLabel.CENTER);

显示矩形大小相同

Dimension d = card1.getPreferredSize(); 
int width = d.width + 100;
int height = d.height + 50;

add1.setPreferredSize(new Dimension(width, height));
add2.setPreferredSize(new Dimension(width, height));
mult1.setPreferredSize(new Dimension(width, height));
mult2.setPreferredSize(new Dimension(width, height));

textFieldA.setPreferredSize(new Dimension(width, height));
textFieldM.setPreferredSize(new Dimension(width, height));

添加到面板

panel2a.add(add1);
panel2a.add(opA);
panel2a.add(add2);
panel2a.add(enterA);
panel2a.add(textFieldA);
panel2c.add(mult1);
panel2c.add(opM);
panel2c.add(mult2);
panel2c.add(enterM);
panel2c.add(textFieldM);
panel2.add(panel2a);
panel2.add(panel2c);

【问题讨论】:

对于常规布局,我不这么认为。 Netbeans 使用布局对齐组件,(我认为)代码使用它非常难看。 (这是一个自定义布局,可能会包含在最近的 Java 版本中) 当然,看看A Visual Guide to Layout Managers。想到GridBagLayout 另见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 【参考方案1】:

跨容器布局管理实际上是不可能的(或者至少我从未见过这样做的布局管理器)。

但是,您可以仔细考虑您的布局要求并使用复合组件和布局管理器产生一些有趣的效果...

public class TestLayout 

    public static void main(String[] args) 
        new TestLayout();
    

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

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridLayout(2, 0));
                frame.add(new CalculatePane("+"));
                frame.add(new CalculatePane("x"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class CalculatePane extends JPanel 

        public CalculatePane(String operator) 
            setLayout(new GridBagLayout());
            Font font = UIManager.getFont("TextField.font").deriveFont(Font.BOLD, 24);
            JTextField field1 = new JTextField(2);
            JTextField field2 = new JTextField(2);
            JTextField field3 = new JTextField(2);
            field1.setFont(font);
            field2.setFont(font);
            field3.setFont(font);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.fill = GridBagConstraints.BOTH;
            add(field1, gbc);
            gbc.gridx++;
            add(new JLabel(operator), gbc);
            gbc.gridx++;
            add(field2, gbc);
            gbc.gridx++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JButton("="), gbc);
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx++;
            add(field3, gbc);


        

    


【讨论】:

【参考方案2】:

AFAIU 这可以使用GroupLayout 来实现。这种布局需要 5 个水平组和 2 个垂直组。

请参阅How to Use GroupLayout 获取示例(包括对该图像的讨论)。

有关 MCVE,另请参阅 this answer。

【讨论】:

我可以看到我的周末将用于阅读GroupLayout:P

以上是关于按边缘排列摆动组件的主要内容,如果未能解决你的问题,请参考以下文章

求助:MATLAB处理图像,已提取边缘,也得到了边缘的二值矩阵,提取坐标是用【m,n】 = find(BW==1)

线性布局

接缝边缘穿过的 UV/纹理像素未按预期绘制

r 尝试按名称索引igraph边缘失败

Flutter:将按钮边缘与其他组件对齐

5.2 基本边缘检测算子—Sobel