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);
}
}
}
Отвечу на пару вопросов:
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Решаю задачкуВ общем, начальную строку нужно преобразовать в новую, заменив все повторяющиеся символы на правую скобочку ')', а все уникальные...
Нужно сделать закругленные края в счётчике Navigation Drawer, на картинке, без использования библиотеки
Пытаюсь передать int значение из одного класса в другой, но значение не передается и присваивается default значение
Приведу пример своей реализацииЧать класс Utils: