Как мне объединить JTextField и JRadioButton? - PullRequest
2 голосов
/ 30 ноября 2011

Я хотел бы иметь JRadioPanel с тремя вариантами.Первые два являются жестко заданными параметрами, и я хочу, чтобы третий был кнопкой «Другое».Я хотел бы иметь JTextField вместо текста в качестве заголовка этой кнопки, но я не уверен, как это сделать.Я попытался просто указать поле в качестве аргумента для переключателя, но мне это не очень понравилось.Я не нашел ничего в Интернете, чтобы рассказать мне, как, за исключением, может быть, через NetBeans, и это не очень мне помогает.Есть ли какой-нибудь способ легко сделать это, или мне придется делать какие-то модные вещи с макетом?

Хорошо, новая проблема.Все кнопки выглядят правильно, но по какой-то причине они находятся в ряду, а не в столбце.Вот код для этого.Не уверен, почему он это делает.

    tf2 = new JTextField("Other", 20);
    newName.setActionCommand("newname");
    fulfillment.setActionCommand("fulfillment");
    fulfillment.setSelected(true);
    type.add(fulfillment);
    type.add(newName);
    fulfillment.addActionListener(this);
    newName.addActionListener(this);
    GridBagConstraints rC = new GridBagConstraints();
    JPanel radioPanel3 = new JPanel(new GridBagLayout());
    rC.gridwidth = 2;
    radioPanel3.add(fulfillment);
    rC.gridy = 1;
    radioPanel3.add(newName);
    rC.gridy = 2;
    rC.gridwidth = 1;
    radioPanel3.add(other);
    rC.gridx = 1;
    radioPanel3.add(tf2);
    c.gridx = 10;
    c.gridy = 4;
    pane.add(radioPanel3, c);

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Поместите третью кнопку без текста и добавьте JTextField. Например. Используйте GridBagLayout, где первая и вторая радиокнопки занимают 2 столбца, а в третьей строке «пустая» радиокнопка имеет строку = 2 col = 0 и JTextField row = 2 col = 1

2 голосов
/ 30 ноября 2011

вы можете создать пользовательский компонент, который будет редактируемым, и вы можете добавить метод setLabelFor (), но зачем изобретать колесо

  1. удалить любое повествование для JRadioButtons / JCheckBoxes

  2. добавить положить туда JTextFields

    • для установки начального размера, например JTextField (10) для создания начального разрыва между JTextField и следующими JRadioButtons / JCheckBoxes

    • setBorder (нуль)

    • setBackground (нуль)

    • setEditable (ложь)

    • setOpaque (false) для эффекта полупрозрачности

  3. тогда все, что JCmponents поместили в JPanel, нет причин для изменения LayoutManager, потому что по умолчанию JPanel имеет FlowLayout

enter image description here

из кода

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class AddComponentsAtRuntime {

    private JFrame f;
    private JPanel panel;
    private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack;
    private JTextField checkValidateTex, checkReValidateTex, checkRepaintTex, checkPackTex;

    public AddComponentsAtRuntime() {
        JButton b = new JButton();
        b.setBackground(Color.red);
        b.setBorder(new LineBorder(Color.black, 2));
        b.setPreferredSize(new Dimension(600, 10));
        panel = new JPanel(new GridLayout(0, 1));
        panel.add(b);
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(panel, "Center");
        f.add(getCheckBoxPanel(), "South");
        f.setLocation(200, 200);
        f.pack();
        f.setVisible(true);
    }

    private JPanel getCheckBoxPanel() {
        checkValidateTex = new JTextField(10);
        checkValidateTex.setText("validate");
        //checkValidateTex.setBorder(null);
        //checkValidateTex.setBackground(null);
        //checkValidateTex.setOpaque(false);
        //checkValidateTex.setEditable(false);
        checkValidate = new JCheckBox();
        //checkValidate = new JCheckBox("validate");
        checkValidate.setSelected(false);
        checkReValidateTex = new JTextField("revalidate");
        checkReValidateTex.setBorder(null);
        checkReValidateTex.setBackground(null);
        checkReValidateTex.setOpaque(false);
        checkReValidateTex.setEditable(false);
        checkReValidate = new JCheckBox();
        //checkReValidate = new JCheckBox("revalidate");
        checkReValidate.setSelected(false);
        checkRepaintTex = new JTextField("repaint");
        checkRepaintTex.setBorder(null);
        checkRepaintTex.setBackground(null);
        checkRepaintTex.setOpaque(false);
        checkRepaintTex.setEditable(false);
        checkRepaint = new JCheckBox();
        //checkRepaint = new JCheckBox("repaint");
        checkRepaint.setSelected(false);
        checkPackTex = new JTextField("pack");
        checkPackTex.setBorder(null);
        checkPackTex.setBackground(null);
        checkPackTex.setOpaque(false);
        checkPackTex.setEditable(false);
        checkPack = new JCheckBox();
        //checkPack = new JCheckBox("pack");
        checkPack.setSelected(false);
        JButton addComp = new JButton("Add New One");
        addComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = new JButton();
                b.setBackground(Color.red);
                b.setBorder(new LineBorder(Color.black, 2));
                b.setPreferredSize(new Dimension(600, 10));
                panel.add(b);
                makeChange();
                System.out.println(" Components Count after Adds :" + panel.getComponentCount());
            }
        });
        JButton removeComp = new JButton("Remove One");
        removeComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int count = panel.getComponentCount();
                if (count > 0) {
                    panel.remove(0);
                }
                makeChange();
                System.out.println(" Components Count after Removes :" + panel.getComponentCount());
            }
        });
        JPanel panel2 = new JPanel();
        panel2.add(checkValidate);
        panel2.add(checkValidateTex);
        panel2.add(checkReValidate);
        panel2.add(checkReValidateTex);
        panel2.add(checkRepaint);
        panel2.add(checkRepaintTex);
        panel2.add(checkPack);
        panel2.add(checkPackTex);
        panel2.add(addComp);
        panel2.add(removeComp);
        return panel2;
    }

    private void makeChange() {
        if (checkValidate.isSelected()) {
            panel.validate();
        }
        if (checkReValidate.isSelected()) {
            panel.revalidate();
        }
        if (checkRepaint.isSelected()) {
            panel.repaint();
        }
        if (checkPack.isSelected()) {
            f.pack();
        }
    }

    public static void main(String[] args) {
        AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime();
    }
}
0 голосов
/ 30 ноября 2011

Вы должны будете делать более интересные вещи с макетом.Нет ничего встроенного, что делает это в разгаре ...

Это не должно быть так сложно реализовать, хотя!Использование NetBeans - хорошая идея для GUI.Вы должны рассмотреть возможность использования IDE для GUI-части проекта.Он сгенерирует код для вас, так что в худшем случае вы должны рассмотреть возможность использования сгенерированного кода в вашей любимой IDE в форме фактического исходного кода или сгенерированного jarЯ сделал это очень много, так как мой любимый редактор - Eclipse, и я предпочитаю иметь редактор графического интерфейса wysiwig.

Eclipse также имеет множество плагинов для редактора wysiwyg, которые вы можете проверить, но я никогда не делал этого.Вот один из них: http://www.ibm.com/developerworks/opensource/library/os-ecvisual/

...