3

スイングコンポーネントを並べることはできますか?コンポーネントは別々のパネルにあり、どちらもフローレイアウトを使用しています。これらの2つのパネルは、グリッドレイアウトを使用している別のパネルにあります。

画像

ご覧のとおり、微妙な違いがあり、面倒です。すべてのjlabels[青/紫の長方形はすべて同じサイズなので、「+」と「*」のせいかもしれませんが、最初の左側が2つのボックスが並んでいません。

パネル

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

最初の2つの長方形(紫)

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

2つの青い長方形

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

2 に答える 2

6

クロスコンテナレイアウト管理は実際には不可能です(または、少なくとも私はそれを行うレイアウトマネージャーを見たことがありません)。

ただし、レイアウト要件について慎重に検討し、複合コンポーネントとレイアウトマネージャーを使用していくつかの興味深い効果を生み出すことができます...

ここに画像の説明を入力してください

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


        }

    }

}
于 2012-11-09T03:02:59.313 に答える
6

AFAIUこれは、を使用して実現できますGroupLayout。このレイアウトには、5つの水平グループと2つの垂直グループが必要です。

GroupLayout垂直および水平グループ

例(その画像の説明を含む)については、GroupLayoutの使用方法を参照してください。

MCVEについては、この回答も参照してください。

于 2012-11-09T04:49:34.347 に答える