SettingsWindow.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package holeg.ui;
  2. import holeg.PowerFlowSettings;
  3. import holeg.SlackNodePlacementStrategy;
  4. import javax.swing.*;
  5. import javax.swing.event.ChangeListener;
  6. import java.awt.*;
  7. import java.util.function.Consumer;
  8. public class SettingsWindow extends JDialog {
  9. public SettingsWindow(Frame owner, PowerFlowSettings settings) {
  10. super(owner);
  11. setTitle("HOLEG: Power flow settings");
  12. setSize(400, 600);
  13. getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
  14. createCheckbox("Only update grid when changed", settings.onlyUpdateGridWhenChanged, (e) -> {
  15. settings.onlyUpdateGridWhenChanged = e;
  16. });
  17. createCheckbox("Wait for solver job", settings.waitForSolverJob, (e) -> {
  18. settings.waitForSolverJob = e;
  19. });
  20. createCheckbox("Skip grids with no producers", settings.skipGridsWithNoProducers, (e) -> {
  21. settings.skipGridsWithNoProducers = e;
  22. });
  23. createCheckbox("Replace node with slack node", settings.replaceNodeWithSlackNode, (e) -> {
  24. settings.replaceNodeWithSlackNode = e;
  25. });
  26. createComboBox("Slack node placement strategy", SlackNodePlacementStrategy.values(), settings.slackNodePlacementStrategy, (e) -> {
  27. settings.slackNodePlacementStrategy = e;
  28. });
  29. createNumberTextBox("Solver threads per subgrid", settings.maxSolverThreads, (e) -> {
  30. settings.maxSolverThreads = e;
  31. });
  32. createNumberTextBox("Max iterations", settings.solverSettings.maxIterations, (e) -> {
  33. settings.solverSettings.maxIterations = e;
  34. });
  35. createNumberTextBox("Jacobian recalculation interval", settings.solverSettings.jacobianRecalculationInterval, (e) -> {
  36. settings.solverSettings.jacobianRecalculationInterval = e;
  37. });
  38. createNumberTextBox("Min voltage until invalid", settings.minVoltageUntilInvalid, (e) -> {
  39. settings.minVoltageUntilInvalid = e;
  40. });
  41. }
  42. private void createCheckbox(String label, boolean value, Consumer<Boolean> listener) {
  43. JCheckBox checkbox = new JCheckBox();
  44. checkbox.setText(label);
  45. checkbox.setSelected(value);
  46. checkbox.setAlignmentX(Component.LEFT_ALIGNMENT);
  47. checkbox.addActionListener((e) -> {
  48. if (listener != null)
  49. listener.accept(((JCheckBox) e.getSource()).isSelected());
  50. });
  51. add(checkbox);
  52. }
  53. private <T> void createComboBox(String label, T[] choices, T value, Consumer<T> listener) {
  54. Container container = new Container();
  55. container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
  56. // Add label
  57. container.add(new JLabel(label));
  58. // Create combo box
  59. JComboBox<T> comboBox = new JComboBox<T>(choices);
  60. comboBox.setSelectedItem(value);
  61. comboBox.setMaximumSize(comboBox.getPreferredSize());
  62. comboBox.setAlignmentX(Component.LEFT_ALIGNMENT);
  63. comboBox.addActionListener((e) -> {
  64. if (listener != null)
  65. listener.accept((T) ((JComboBox<T>) e.getSource()).getSelectedItem());
  66. });
  67. container.add(comboBox);
  68. add(container);
  69. }
  70. private JTextField createTextField(String value) {
  71. JTextField textField = new JTextField();
  72. textField.setColumns(8);
  73. textField.setText(value);
  74. textField.setMaximumSize(textField.getPreferredSize());
  75. textField.setAlignmentX(Component.LEFT_ALIGNMENT);
  76. return textField;
  77. }
  78. private void createNumberTextBox(String label, Integer value, Consumer<Integer> listener) {
  79. Container container = new Container();
  80. container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
  81. // Add label
  82. container.add(new JLabel(label));
  83. // Create text field
  84. JTextField textField = createTextField(Integer.toString(value));
  85. textField.getDocument().addDocumentListener((SimpleDocumentListener)(e) -> {
  86. if (listener != null) {
  87. String text = textField.getText();
  88. try {
  89. listener.accept(Integer.parseInt(text));
  90. }
  91. catch(NumberFormatException ignored) {
  92. }
  93. }
  94. });
  95. container.add(textField);
  96. add(container);
  97. }
  98. private void createNumberTextBox(String label, Double value, Consumer<Double> listener) {
  99. Container container = new Container();
  100. container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
  101. // Add label
  102. container.add(new JLabel(label));
  103. // Create text field
  104. JTextField textField = createTextField(Double.toString(value));
  105. textField.getDocument().addDocumentListener((SimpleDocumentListener)(e) -> {
  106. if (listener != null) {
  107. String text = textField.getText();
  108. try {
  109. listener.accept(Double.parseDouble(text));
  110. }
  111. catch(NumberFormatException ignored) {
  112. }
  113. }
  114. });
  115. container.add(textField);
  116. add(container);
  117. }
  118. }