Проблема с версией Swing - PullRequest
       0

Проблема с версией Swing

2 голосов
/ 25 августа 2011

Я заблудился во время выкладывания кошмаров на Swing :( Я собираюсь раскрыть мою проблему, но я ищу советы, а также ясное решение.

Моя проблема: я хочу создать такую ​​форму:

enter image description here

И я борюсь с кодом, сгенерированным Netbeans:

private void initComponents() {

    buttonGroup1 = new javax.swing.ButtonGroup();
    buttonGroup2 = new javax.swing.ButtonGroup();
    jPanel1 = new javax.swing.JPanel();
    jPanel2 = new javax.swing.JPanel();
    jTextField1 = new javax.swing.JTextField();
    jTextField2 = new javax.swing.JTextField();
    jPanel3 = new javax.swing.JPanel();
    jPanel4 = new javax.swing.JPanel();
    jRadioButton1 = new javax.swing.JRadioButton();
    jRadioButton2 = new javax.swing.JRadioButton();
    jRadioButton3 = new javax.swing.JRadioButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setMinimumSize(new java.awt.Dimension(200, 200));

    jPanel1.setMinimumSize(new java.awt.Dimension(400, 44));
    jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS));

    jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 255, 255)));
    jPanel2.setMaximumSize(new java.awt.Dimension(11111111, 2147483647));
    jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.X_AXIS));

    jTextField1.setFont(new java.awt.Font("Lucida Grande", 0, 48)); // NOI18N
    jTextField1.setText("jTextField1");
    jTextField1.setAlignmentY(0.0F);
    jTextField1.setMaximumSize(new java.awt.Dimension(150, 2147483647));
    jTextField1.setPreferredSize(new java.awt.Dimension(100, 42));
    jPanel2.add(jTextField1);

    jTextField2.setFont(new java.awt.Font("Lucida Grande", 0, 8)); // NOI18N
    jTextField2.setText("jTextField2");
    jTextField2.setAlignmentY(0.0F);
    jTextField2.setMaximumSize(new java.awt.Dimension(150, 2147483647));
    jTextField2.setPreferredSize(new java.awt.Dimension(100, 28));
    jTextField2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2ActionPerformed(evt);
        }
    });
    jPanel2.add(jTextField2);

    jPanel1.add(jPanel2);

    jPanel3.setForeground(new java.awt.Color(255, 51, 51));
    jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.LINE_AXIS));

    jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.Y_AXIS));

    jRadioButton1.setText("jRadioButton1");
    jPanel4.add(jRadioButton1);

    jRadioButton2.setText("jRadioButton2");
    jPanel4.add(jRadioButton2);

    jRadioButton3.setText("jRadioButton3");
    jPanel4.add(jRadioButton3);

    jPanel3.add(jPanel4);

    jPanel1.add(jPanel3);

    getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

    pack();
}

Что-то, чего я действительно не понимаю, это то, что когда я изменяю расположение jPanel3, происходит изменение в рендеринге jPanel2!

Может кто-нибудь дать мне путь для подражания?

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Нечто подобное может быть отправной точкой при использовании BoxLayout:

JPanel panel1= new JPanel();
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));

JPanel panel2= new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS));
panel2.setMinimumSize(...); panel2.setMaximumSize(...) ; panel2.setPreferredSize(...);

JPanel panel3 = new JPanel();
panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS));
panel3 .setMinimumSize(...); panel3 .setMaximumSize(...) ; panel3 .setPreferredSize(...);

JTextField tf1 = new JTextField("text_field_1");
tf1.setMinimumSize(...); tf1.setMaximumSize(...) ; tf1.setPreferredSize(...);

panel2.add(tf1);
panel.add(panel2);
panel.add(panel3);
panel.add(Box.createVerticalGlue());
panel.add(Box.createRigidArea(new Dimension(...)));
2 голосов
/ 25 августа 2011

Я рекомендую использовать GridBagLayout , поскольку он дает вам лучший контроль над тем, где расположены компоненты и сколько места они занимают.

Например, чтобы заполнить JPanel 2 и 3вверх по панели содержимого вы должны сделать:

GridBagConstraints constraints = new GridBagConstraints();
JPanel jPanel1 = new JPanel(new GridBagLayout());
constraints.fill = GridBagConstraints.HORIZONTAL;
jPanel1.add(jPanel2, constraints);
constraints.gridy ++;
jPanel1.add(jPanel2, constraints);

Кроме того, если вы хотите, чтобы ваш код Swing был понятным, когда вы вернетесь к нему через несколько дней, вы захотите разбить его на функции и использовать более описательную переменную.имена, такие как "topTextPanel" и "middleButtonPanel".

1 голос
/ 25 августа 2011

Это вполне возможно с NetBeans.

Но есть три вещи, которые вы должны знать, чтобы работать с Матиссом (дизайнером Swing в NetBeans):

  1. Чтобы контейнер помещался вокруг его содержимого, необходимо изменить размер контейнера, пока он не будет привязан к содержимому.

  2. Чтобы содержимое соответствовало размеру контейнера, необходимо изменить размер содержимого до тех пор, пока оно не укажет границу контейнера.

  3. Вы всегда можете вручную настроить поведение авторазмера компонента, щелкнув его правой кнопкой мыши и выбрав нужный элемент в подменю Авторазмер .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...