From 34a71d5ef73823ee8f780046400c9c6f1713df0b Mon Sep 17 00:00:00 2001 From: Yuri Tatishchev Date: Wed, 16 Apr 2025 23:24:18 -0700 Subject: [PATCH] midterm2: solve 5.2 - improve 5.1 --- midterm2/src/BarFrame.java | 79 +++++++++++++++++++------------- midterm2/src/ObserverTester.java | 1 + midterm2/src/TextFrame.java | 17 ++++++- 3 files changed, 63 insertions(+), 34 deletions(-) diff --git a/midterm2/src/BarFrame.java b/midterm2/src/BarFrame.java index cafca04..4bf3177 100644 --- a/midterm2/src/BarFrame.java +++ b/midterm2/src/BarFrame.java @@ -1,4 +1,5 @@ import java.awt.*; +import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; import javax.swing.event.*; @@ -21,44 +22,27 @@ public class BarFrame extends JFrame implements ChangeListener { setLocation(0, 200); setLayout(new BorderLayout()); - Icon barIcon = new Icon() { - public int getIconWidth() { - return ICON_WIDTH; - } + JLabel barLabel = new JLabel(); + barLabel.setIcon(new BarIcon()); + barLabel.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + int mouseX = e.getX(); + int mouseY = e.getY(); - public int getIconHeight() { - return ICON_HEIGHT; - } + double max = a.stream().max(Double::compare).orElse(1.0); + double barHeight = ICON_HEIGHT / (double) a.size(); - public void paintIcon(Component c, Graphics g, int x, int y) { - Graphics2D g2 = (Graphics2D) g; - - g2.setColor(Color.red); - - double max = (a.get(0)).doubleValue(); - for (Double v : a) { - double val = v.doubleValue(); - if (val > max) - max = val; - } - - double barHeight = getIconHeight() / a.size(); - - int i = 0; - for (Double v : a) { - double value = v.doubleValue(); - - double barLength = getIconWidth() * value / max; - - Rectangle2D.Double rectangle = new Rectangle2D.Double - (0, barHeight * i, barLength, barHeight); - i++; - g2.fill(rectangle); + // Find the nearest bar to the mouse click + int index = (int) (mouseY / barHeight); + if (index >= 0 && index < a.size()) { + double newValue = max * mouseX / ICON_WIDTH; + dataModel.update(index, newValue); } } - }; + }); - add(new JLabel(barIcon)); + add(barLabel); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); @@ -75,6 +59,35 @@ public class BarFrame extends JFrame implements ChangeListener { repaint(); } + private class BarIcon implements Icon { + public int getIconWidth() { + return ICON_WIDTH; + } + + public int getIconHeight() { + return ICON_HEIGHT; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2 = (Graphics2D) g; + + g2.setColor(Color.red); + + double max = a.stream().max(Double::compare).orElse(1.0); + double barHeight = getIconHeight() / (double) a.size(); + + int i = 0; + for (Double value : a) { + double barLength = getIconWidth() * value / max; + + Rectangle2D.Double rectangle = new Rectangle2D.Double( + 0, barHeight * i, barLength, barHeight); + i++; + g2.fill(rectangle); + } + } + } + private ArrayList a; private DataModel dataModel; diff --git a/midterm2/src/ObserverTester.java b/midterm2/src/ObserverTester.java index 8ad17e0..bab31fd 100644 --- a/midterm2/src/ObserverTester.java +++ b/midterm2/src/ObserverTester.java @@ -23,6 +23,7 @@ public class ObserverTester { BarFrame barFrame = new BarFrame(model); + model.attach(frame); model.attach(barFrame); } } diff --git a/midterm2/src/TextFrame.java b/midterm2/src/TextFrame.java index 0f5ead7..2f5164e 100644 --- a/midterm2/src/TextFrame.java +++ b/midterm2/src/TextFrame.java @@ -1,12 +1,14 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.util.ArrayList; /** * A class for displaying the model as a column of textfields in a frame. */ -public class TextFrame extends JFrame { +public class TextFrame extends JFrame implements ChangeListener { /** * Constructs a JFrame that contains the textfields containing the data * in the model. @@ -56,6 +58,19 @@ public class TextFrame extends JFrame { setVisible(true); } + /** + * Called when the data in the model is changed. + * + * @param e the event representing the change + */ + @Override + public void stateChanged(ChangeEvent e) { + ArrayList a = dataModel.getData(); + for (int i = 0; i < a.size(); i++) { + fieldList[i].setText(a.get(i).toString()); + } + } + DataModel dataModel; JTextField[] fieldList; }