BoxLayout и JRadioButton не хотят дружить

167
07 октября 2018, 09:20

UPD.

В общем пишу класс для теста(вопросы беру из файла и к ним добавляю РадиоБаттоны) и в конце появилось несколько косяков. Как с ними справиться, даже понятия не имею.

Окно теста прокручивается до конца при запуске, а хотелось бы чтобы не прокручивалось.

Класс, из которого вызывается окно теста:

package frames;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class RegistrationFrame extends JFrame {
    private String testName;
    private JPanel registerPanel = new JPanel();
    private JLabel fioLabel = new JLabel("Введите Ф.И.О.:");
    private JTextField fioField = new JTextField();
    private JLabel specLabel = new JLabel("Введите название специальности:");
    private JTextField specField = new JTextField();
    private JLabel groupLabel = new JLabel("Введите номер группы:");
    private JTextField groupField = new JTextField();
    private JButton acceptButton = new JButton("Принять");
    private JButton cancelButton = new JButton(" Отмена ");
    public RegistrationFrame(String testName){
    super("Регистрация");
    this.testName = testName;
    registerPanel.setLayout(new BoxLayout(registerPanel, BoxLayout.Y_AXIS));
    setContentPane(registerPanel);
    setSize(350, 200);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
    runReg();
    setVisible(true);
}
private void runReg(){
    registerPanel.add(specLabel);
    registerPanel.add(specField);
    registerPanel.add(groupLabel);
    registerPanel.add(groupField);
    registerPanel.add(fioLabel);
    registerPanel.add(fioField);
    acceptButton.addActionListener(new AcceptActionListener());
    cancelButton.addActionListener(new CancelActionListener());
    registerPanel.add(acceptButton);
    registerPanel.add(cancelButton);
}
public class CancelActionListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        dispose();
    }
}
public class AcceptActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(specField.getText().length() == 0){
            showErrorMessage("Введите название специальности!");
        } else if(groupField.getText().length() == 0){
            showErrorMessage("Введите номер группы!");
        } else if(fioField.getText().length() == 0){
            showErrorMessage("Введите Ф.И.О.!");
        } else {
            new TestFrame(testName, fioField.getText(), groupField.getText(), specField.getText());
            dispose();
        }
    }
    private void showErrorMessage(String text){
        JOptionPane.showMessageDialog(RegistrationFrame.this, text, "Ошибка!", JOptionPane.ERROR_MESSAGE);
    }
}
}

Класс теста:

package frames;
import readWrite.MyFileReader;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
class TestFrame extends JFrame {
    private JPanel test1Panel = new JPanel();
    private JScrollPane scrollPane = new JScrollPane(test1Panel);
    private String testName;
    private String fio;
    private String studGroup;
    private String spec;
    private Map<Integer, ButtonGroup> resultMap = new HashMap<>();
    public TestFrame(String title, String fio, String studGroup, String spec){
    super(title);
    this.testName = title;
    this.fio = fio;
    this.studGroup = studGroup;
    this.spec = spec;
    test1Panel.setLayout(new BoxLayout(test1Panel, BoxLayout.Y_AXIS));
    test1Panel.setAlignmentX(Component.LEFT_ALIGNMENT);
    setSize(800, 600);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
    getContentPane().add(scrollPane);
    runTest1();
    setVisible(true);
}
private void runTest1(){
    Integer id = 1;
    MyFileReader freader = new MyFileReader();
    ArrayList<String> testQuestions = freader.getTestQuestions(testName);
    for(String question : testQuestions) {
        test1Panel.add(new QPanel(question, 760, 85, id));
        id++;
    }
}
private class QPanel extends JPanel {
    private JTextArea textArea;
    private JRadioButton radioButtonYes;
    private JRadioButton radioButtonNo;
    public QPanel(String text, int width, int heigth, Integer id) {
        Dimension dimension = new Dimension(width, heigth);
        setMinimumSize(dimension);
        setMaximumSize(dimension);
        setPreferredSize(dimension);
        setSize(dimension);
        setLayout(new BorderLayout());
        textArea = new JTextArea(text);
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        textArea.setEditable(false);
        JPanel panelRadio = new JPanel();
        BoxLayout boxLayout = new BoxLayout(panelRadio, BoxLayout.Y_AXIS);
        panelRadio.setLayout(boxLayout);
        panelRadio.setAlignmentX(JPanel.LEFT_ALIGNMENT);
        radioButtonYes = new JRadioButton("Да", false);
        radioButtonNo = new JRadioButton("Нет", false);
        panelRadio.add(radioButtonYes);
        panelRadio.add(radioButtonNo);
        ButtonGroup butGroup = new ButtonGroup();
        butGroup.add(radioButtonYes);
        butGroup.add(radioButtonNo);
        add(textArea, BorderLayout.CENTER);
        add(panelRadio, BorderLayout.SOUTH);
        resultMap.put(id, butGroup);
    }
}
}
Answer 1

Отвечу на пару вопросов:
1. РадиоБаттоны не хотят выравниваться слева.
2. Окно теста прокручивается до конца при запуске, а хотелось бы чтобы не прокручивалось.

Посмотрите мой пример ниже. Так же советую посмотреть в сторону компоновки через отдельную панель (у меня в примере).

По 3 вопросу не все так просто, скролл не знает как нужно мотать Ваш компонент, насколько я помню, нужно переопределить какие-то методы и самому высчитывать как нужно мотать.

Очень детально этот вопрос рассматривается в книге: "Иван Портянкин: Swing. Эффектные пользовательские интерфейсы"

    import javax.swing.*;
    import java.awt.*;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    public class TestFrame extends JFrame {
        private JPanel test1Panel = new JPanel();
        private JScrollPane scrollPane = new JScrollPane(test1Panel);
        private String testName;
        private String fio;
        private String studGroup;
        private String spec;
        private Map<Integer, ButtonGroup> resultMap = new HashMap<>();
        public TestFrame(String title, String fio, String studGroup, String spec) {
            super(title);
            this.testName = title;
            this.fio = fio;
            this.studGroup = studGroup;
            this.spec = spec;
            test1Panel.setLayout(new BoxLayout(test1Panel, BoxLayout.Y_AXIS));
            test1Panel.setAlignmentX(Component.LEFT_ALIGNMENT);
            setSize(800, 600);
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            getContentPane().add(scrollPane);
            runTest1();
            setVisible(true);
        }
        public static void main(String[] args) {
            new TestFrame("sdsdv", "dvsdv", "dvsdvs", "sdvsdvsdvsv");
        }
        private void runTest1() {
            Integer id = 1;
            List<String> testQuestions = Arrays.asList(
                "test",
                "test",
                "sdvsdvsv",
                "dvsdvsdvsdv",
                "sdvasdvasddv",
                "asdvasdvasddvasdv");
            for (String question : testQuestions) {
                test1Panel.add(new QPanel(question, 760, 200));
                id++;
            }
        }
        private class QPanel extends JPanel {
            private JTextArea textArea;
            private JRadioButton radioButtonYes;
            private JRadioButton radioButtonNo;
            public QPanel(String text, int width, int heigth) {
                Dimension dimension = new Dimension(width, heigth);
                setMinimumSize(dimension);
                setMaximumSize(dimension);
                setPreferredSize(dimension);
                setSize(dimension);
                setLayout(new BorderLayout());
                textArea = new JTextArea(text);
                JPanel panelRadio = new JPanel();
                BoxLayout boxLayout = new BoxLayout(panelRadio, BoxLayout.Y_AXIS);
                panelRadio.setLayout(boxLayout);
                panelRadio.setAlignmentX(JPanel.LEFT_ALIGNMENT);
                radioButtonYes = new JRadioButton("Да", false);
                radioButtonNo = new JRadioButton("Нет", false);
                panelRadio.add(radioButtonYes);
                panelRadio.add(radioButtonNo);
                ButtonGroup butGroup = new ButtonGroup();
                butGroup.add(radioButtonYes);
                butGroup.add(radioButtonNo);
                add(new JScrollPane(textArea), BorderLayout.CENTER);
                add(panelRadio, BorderLayout.SOUTH);
            }
        }
    }

UPD:
1. Нашел Вашу ошибку, чтоб прокрутка была сначала, необходимо текстовый компонент оборачивать в прокрутку:

        butGroup.add(radioButtonYes);
        butGroup.add(radioButtonNo);
        add(new JScrollPane(textArea), BorderLayout.CENTER);
        add(panelRadio, BorderLayout.SOUTH);

Если вы не хотите прокрутку к текстовому компоненту, используйте вместо него JLabel.
2. Добавьте шаг прокрутки, чтоб получившаяся панель с более большим шагом прокручивалась:

    setSize(800, 600);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
    scrollPane.getVerticalScrollBar().setUnitIncrement(10);
READ ALSO
local variables referenced from a lambda expression must be final or effectively final при фильтрации символов в строке

local variables referenced from a lambda expression must be final or effectively final при фильтрации символов в строке

Решаю задачкуВ общем, начальную строку нужно преобразовать в новую, заменив все повторяющиеся символы на правую скобочку ')', а все уникальные...

195
Закругленный фон в счётчике Navigtion Drawer

Закругленный фон в счётчике Navigtion Drawer

Нужно сделать закругленные края в счётчике Navigation Drawer, на картинке, без использования библиотеки

144
В чем причина получения default значения при Intent?

В чем причина получения default значения при Intent?

Пытаюсь передать int значение из одного класса в другой, но значение не передается и присваивается default значение

160
Как вытащить данные из сессии для других активностей [закрыт]

Как вытащить данные из сессии для других активностей [закрыт]

Приведу пример своей реализацииЧать класс Utils:

170