Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

This is a java project with specific directions I have to complete, the full ins

ID: 3767121 • Letter: T

Question

This is a java project with specific directions I have to complete, the full instructions are here:

https://www.cs.umd.edu/class/fall2015/cmsc131/content/projects/Marquee/Marquee.html

with extra project notes here:

https://www.cs.umd.edu/class/fall2015/cmsc131/content/projects/Marquee/MarqueeProjectNotes.pdf

For both, the username is cmsc131 and the password is java131. The only class I am allowed to create/edit is MarqueeDataManager.java which implements the DataManager class. I have to at least create a basic constructor like so

as well as implement the step() method. Both of these have very particular instructions as noted in the links I provided above. Any help would be greatly appreciated, thanks! Please do not hesitate to ask any clarifying questions, I have asked this question on Chegg already and the answer did not really apply to my project. Please read the directions!

Explanation / Answer

Create the packages given the below names in the each class.

package com.ggl.marquee;

import javax.swing.SwingUtilities;

Marquee.java

import com.ggl.marquee.model.MarqueeModel;
import com.ggl.marquee.view.MarqueeFrame;

public class Marquee implements Runnable {

@Override
public void run() {
new MarqueeFrame(new MarqueeModel());
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Marquee());
}

}


MarqueeModel.java

package com.ggl.marquee.model;

import javax.swing.DefaultListModel;

import com.ggl.marquee.runnable.DisplayTextPixelsRunnable;
import com.ggl.marquee.view.MarqueeFrame;

public class MarqueeModel {

private static final int marqueeWidth = 120;

private boolean[][] marqueePixels;
private boolean[][] textPixels;

private DisplayTextPixelsRunnable dtpRunnable;

private MarqueeFontFactory fonts;

private MarqueeFrame frame;

public MarqueeModel() {
this.fonts = new MarqueeFontFactory();
this.marqueePixels = new boolean[marqueeWidth][getMarqueeHeight()];
}

public void setFrame(MarqueeFrame frame) {
this.frame = frame;
}

public MarqueeFontFactory getFonts() {
return fonts;
}

public DefaultListModel<MarqueeFont> getDefaultListModel() {
return fonts.getFontList();
}

public MarqueeFont getDefaultFont() {
return fonts.getDefaultFont();
}

public void setDefaultFont(MarqueeFont defaultFont) {
fonts.setDefaultFont(defaultFont);
}

public boolean[][] getMarqueePixels() {
return marqueePixels;
}

public boolean getMarqueePixel(int width, int height) {
return marqueePixels[width][height];
}

public int getMarqueeWidth() {
return marqueeWidth;
}

public int getMarqueeHeight() {
return fonts.getCharacterHeight();
}

public boolean[][] getTextPixels() {
return textPixels;
}

public int getTextPixelWidth() {
return textPixels.length;
}

private void startDtpRunnable() {
dtpRunnable = new DisplayTextPixelsRunnable(frame, this);
new Thread(dtpRunnable).start();
}

public void stopDtpRunnable() {
if (dtpRunnable != null) {
dtpRunnable.stopDisplayTextPixelsRunnable();
dtpRunnable = null;
}
}

public void setTextPixels(boolean[][] textPixels) {
this.textPixels = textPixels;
if (textPixels.length < getMarqueeWidth()) {
this.marqueePixels = copyCharacterPixels(0, textPixels,
marqueePixels);
} else {
startDtpRunnable();
}
}

public void resetPixels() {
for (int i = 0; i < getMarqueeWidth(); i++) {
for (int j = 0; j < getMarqueeHeight(); j++) {
marqueePixels[i][j] = false;
}
}
}

public void setAllPixels() {
for (int i = 0; i < getMarqueeWidth(); i++) {
for (int j = 0; j < getMarqueeHeight(); j++) {
marqueePixels[i][j] = true;
}
}
}

public boolean[][] copyCharacterPixels(int position,
boolean[][] characterPixels, boolean[][] textPixels) {
for (int i = 0; i < characterPixels.length; i++) {
for (int j = 0; j < characterPixels[i].length; j++) {
textPixels[i + position][j] = characterPixels[i][j];
}
}

return textPixels;
}

public void copyTextPixels(int position) {
for (int i = 0; i < marqueePixels.length; i++) {
int k = i + position;
k %= textPixels.length;
for (int j = 0; j < textPixels[i].length; j++) {
marqueePixels[i][j] = textPixels[k][j];
}
}
}

}

MarqueeFont.java

package com.ggl.marquee.model;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

public class MarqueeFont {

private static final boolean DEBUG = false;

private int fontHeight;

private Font font;

public MarqueeFont(Font font) {
this.font = font;

FontRenderContext frc = new FontRenderContext(null, true, true);
Rectangle2D r2D = font.getStringBounds("HgH", frc);
this.fontHeight = (int) Math.round(r2D.getHeight());

if (DEBUG) {
System.out.println(font.getFamily() + " " + fontHeight + " pixels");
}
}

public boolean[][] getTextPixels(String s) {
FontRenderContext frc = new FontRenderContext(null, true, true);

Rectangle2D r2D = font.getStringBounds(s, frc);
int rWidth = (int) Math.round(r2D.getWidth());
int rHeight = (int) Math.round(r2D.getHeight());
int rX = (int) Math.round(r2D.getX());
int rY = (int) Math.round(r2D.getY());

if (DEBUG) {
System.out.print(s);
System.out.print(", rWidth = " + rWidth);
System.out.print(", rHeight = " + rHeight);
System.out.println(", rX = " + rX + ", rY = " + rY);
}

BufferedImage bi = generateCharacterImage(rX, -rY, rWidth, rHeight, s);
int[][] pixels = convertTo2D(bi);

if (DEBUG) {
displayPixels(pixels);
}

return createTextPixels(pixels);
}

private BufferedImage generateCharacterImage(int x, int y, int width,
int height, String string) {
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
g.setFont(font);

g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);

g.setColor(Color.BLACK);
g.drawString(string, x, y);

return bi;
}

private int[][] convertTo2D(BufferedImage image) {
final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer())
.getData();
final int width = image.getWidth();
final int height = image.getHeight();

int[][] result = new int[height][width];

int row = 0;
int col = 0;
for (int pixel = 0; pixel < pixels.length; pixel++) {
result[row][col] = pixels[pixel];
col++;
if (col == width) {
col = 0;
row++;
}
}

return result;
}

private void displayPixels(int[][] pixels) {
for (int i = 0; i < pixels.length; i++) {
String s = String.format("%03d", (i + 1));
System.out.print(s + ". ");
for (int j = 0; j < pixels[i].length; j++) {
if (pixels[i][j] == -1) {
System.out.print(" ");
} else {
System.out.print("X ");
}
}
System.out.println("");
}
}

private boolean[][] createTextPixels(int[][] pixels) {
// The int array pixels is in column, row order.
// We have to flip the array and produce the output
// in row, column order.
if (DEBUG) {
System.out.println(pixels[0].length + "x" + pixels.length);
}
boolean[][] textPixels = new boolean[pixels[0].length][pixels.length];
for (int i = 0; i < pixels.length; i++) {
for (int j = 0; j < pixels[i].length; j++) {
if (pixels[i][j] == -1) {
textPixels[j][i] = false;
} else {
textPixels[j][i] = true;
}
}
}

return textPixels;
}

public Font getFont() {
return font;
}

public int getFontHeight() {
return fontHeight;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(font.getFamily());
builder.append(", ");
builder.append(getStyleText());
builder.append(", ");
builder.append(font.getSize());
builder.append(" pixels");

return builder.toString();
}

private StringBuilder getStyleText() {
StringBuilder builder = new StringBuilder();
int style = font.getStyle();
if (style == Font.PLAIN) {
builder.append("normal");
} else if (style == Font.BOLD) {
builder.append("bold");
} else if (style == Font.ITALIC) {
builder.append("italic");
} else if (style == (Font.BOLD + Font.ITALIC)) {
builder.append("bold italic");
} else {
builder.append("unknown style");
}
return builder;
}

}


MarqueeFontFactory.java

package com.ggl.marquee.model;

import java.awt.Font;

import javax.swing.DefaultListModel;

public class MarqueeFontFactory {

private DefaultListModel<MarqueeFont> fontList;

private MarqueeFont defaultFont;

public MarqueeFontFactory() {
this.fontList = new DefaultListModel<MarqueeFont>();
addElements();
}

private void addElements() {
this.defaultFont = new MarqueeFont(new Font("Arial", Font.BOLD, 16));
fontList.addElement(defaultFont);
fontList.addElement(new MarqueeFont(new Font("Cambria", Font.BOLD, 16)));
fontList.addElement(new MarqueeFont(new Font("Courier New", Font.BOLD,
16)));
fontList.addElement(new MarqueeFont(new Font("Georgia", Font.BOLD, 16)));
fontList.addElement(new MarqueeFont(new Font("Lucida Calligraphy",
Font.BOLD, 16)));
fontList.addElement(new MarqueeFont(new Font("Times New Roman",
Font.BOLD, 16)));
fontList.addElement(new MarqueeFont(new Font("Verdana", Font.BOLD, 16)));
}

public DefaultListModel<MarqueeFont> getFontList() {
return fontList;
}

public void setDefaultFont(MarqueeFont defaultFont) {
this.defaultFont = defaultFont;
}

public MarqueeFont getDefaultFont() {
return defaultFont;
}

public int getCharacterHeight() {
int maxHeight = 0;
for (int i = 0; i < fontList.getSize(); i++) {
MarqueeFont font = fontList.get(i);
int height = font.getFontHeight();
maxHeight = Math.max(height, maxHeight);
}
return maxHeight;
}
}

MarqueeFrame.java

package com.ggl.marquee.view;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

import com.ggl.marquee.model.MarqueeModel;
import com.ggl.marquee.runnable.DisplayAllPixelsRunnable;

public class MarqueeFrame {

private ControlPanel controlPanel;

private JFrame frame;

private MarqueeModel model;

private MarqueePanel marqueePanel;

public MarqueeFrame(MarqueeModel model) {
this.model = model;
model.setFrame(this);
createPartControl();
}

private void createPartControl() {
frame = new JFrame();
// frame.setIconImage(getFrameImage());
frame.setTitle("Marquee");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
exitProcedure();
}
});

JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

marqueePanel = new MarqueePanel(model);
mainPanel.add(marqueePanel);
controlPanel = new ControlPanel(this, model);
mainPanel.add(controlPanel.getPanel());

frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.getRootPane().setDefaultButton(controlPanel.getSubmitButton());
frame.setVisible(true);

new Thread(new DisplayAllPixelsRunnable(this, model)).start();
}

private void exitProcedure() {
frame.dispose();
System.exit(0);
}

public void repaintMarqueePanel() {
marqueePanel.repaint();
}

}


MarqueePanel.java

package com.ggl.marquee.view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

import com.ggl.marquee.model.MarqueeModel;

public class MarqueePanel extends JPanel {

private static final long serialVersionUID = -1677343084333836763L;

private static final int pixelWidth = 4;
private static final int gapWidth = 2;
private static final int totalWidth = pixelWidth + gapWidth;
private static final int yStart = gapWidth + totalWidth + totalWidth;

private MarqueeModel model;

public MarqueePanel(MarqueeModel model) {
this.model = model;

int width = model.getMarqueeWidth() * totalWidth + gapWidth;
int height = model.getMarqueeHeight() * totalWidth + yStart + yStart;
setPreferredSize(new Dimension(width, height));
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());

int x = gapWidth;
int y = yStart;

for (int i = 0; i < model.getMarqueeWidth(); i++) {
for (int j = 0; j < model.getMarqueeHeight(); j++) {
if (model.getMarqueePixel(i, j)) {
g.setColor(Color.PINK);
} else {
g.setColor(Color.BLACK);
}

g.fillRect(x, y, pixelWidth, pixelWidth);
y += totalWidth;
}
y = yStart;
x += totalWidth;
}
}

}


ControlPanel.java

package com.ggl.marquee.view;

import java.awt.BorderLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

import com.ggl.marquee.controller.CreateMarqueeActionListener;
import com.ggl.marquee.controller.FontSelectionListener;
import com.ggl.marquee.model.MarqueeFont;
import com.ggl.marquee.model.MarqueeModel;

public class ControlPanel {

private JButton submitButton;

private JPanel panel;

private MarqueeFrame frame;

private MarqueeModel model;

public ControlPanel(MarqueeFrame frame, MarqueeModel model) {
this.frame = frame;
this.model = model;
createPartControl();
}

private void createPartControl() {
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

JPanel fontPanel = new JPanel();
fontPanel.setLayout(new BorderLayout());

JLabel fontLabel = new JLabel("Fonts");
fontPanel.add(fontLabel, BorderLayout.NORTH);

JList<MarqueeFont> fontList = new JList<MarqueeFont>(
model.getDefaultListModel());
fontList.setSelectedValue(model.getDefaultFont(), true);
fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fontList.setVisibleRowCount(3);

ListSelectionModel listSelectionModel = fontList.getSelectionModel();
listSelectionModel.addListSelectionListener(new FontSelectionListener(
model));

JScrollPane fontScrollPane = new JScrollPane(fontList);

fontPanel.add(fontScrollPane, BorderLayout.CENTER);

panel.add(fontPanel);

JPanel fieldPanel = new JPanel();

JLabel fieldLabel = new JLabel("Marquee Text: ");
fieldPanel.add(fieldLabel);

JTextField field = new JTextField(30);
fieldPanel.add(field);

panel.add(fieldPanel);

JPanel buttonPanel = new JPanel();

submitButton = new JButton("Submit");
submitButton.addActionListener(new CreateMarqueeActionListener(frame,
model, field));
buttonPanel.add(submitButton);

panel.add(buttonPanel);
}

public JPanel getPanel() {
return panel;
}

public JButton getSubmitButton() {
return submitButton;
}

}

CreateMarqueeActionListener.java

package com.ggl.marquee.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JTextField;

import com.ggl.marquee.model.MarqueeModel;
import com.ggl.marquee.view.MarqueeFrame;

public class CreateMarqueeActionListener implements ActionListener {

private JTextField field;

private MarqueeFrame frame;

private MarqueeModel model;

public CreateMarqueeActionListener(MarqueeFrame frame, MarqueeModel model,
JTextField field) {
this.frame = frame;
this.model = model;
this.field = field;
}

@Override
public void actionPerformed(ActionEvent event) {
model.stopDtpRunnable();
model.resetPixels();

String s = field.getText().trim();
if (s.equals("")) {
frame.repaintMarqueePanel();
return;
}

s = " " + s + " ";
model.setTextPixels(model.getDefaultFont().getTextPixels(s));
frame.repaintMarqueePanel();
}

}


FontSelectionListener.java


package com.ggl.marquee.controller;

import javax.swing.DefaultListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import com.ggl.marquee.model.MarqueeFont;
import com.ggl.marquee.model.MarqueeModel;

public class FontSelectionListener implements ListSelectionListener {

private MarqueeModel model;

public FontSelectionListener(MarqueeModel model) {
this.model = model;
}

@Override
public void valueChanged(ListSelectionEvent event) {
DefaultListSelectionModel selectionModel = (DefaultListSelectionModel) event
.getSource();
if (!event.getValueIsAdjusting()) {
int index = selectionModel.getMinSelectionIndex();
if (index >= 0) {
MarqueeFont font = model.getDefaultListModel().get(index);
model.setDefaultFont(font);
}
}
}

}


DisplayAllPixelsRunnable.java

package com.ggl.marquee.runnable;

import javax.swing.SwingUtilities;

import com.ggl.marquee.model.MarqueeModel;
import com.ggl.marquee.view.MarqueeFrame;

public class DisplayAllPixelsRunnable implements Runnable {

private MarqueeFrame frame;

private MarqueeModel model;

public DisplayAllPixelsRunnable(MarqueeFrame frame, MarqueeModel model) {
this.frame = frame;
this.model = model;
}

@Override
public void run() {
model.setAllPixels();
repaint();

try {
Thread.sleep(3000L);
} catch (InterruptedException e) {

}

model.resetPixels();
repaint();
}

private void repaint() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.repaintMarqueePanel();
}
});
}

}


DisplayTextPixelsRunnable.java


package com.ggl.marquee.runnable;

import javax.swing.SwingUtilities;

import com.ggl.marquee.model.MarqueeModel;
import com.ggl.marquee.view.MarqueeFrame;

public class DisplayTextPixelsRunnable implements Runnable {

private static int textPixelPosition;

private boolean running;

private MarqueeFrame frame;

private MarqueeModel model;

public DisplayTextPixelsRunnable(MarqueeFrame frame, MarqueeModel model) {
this.frame = frame;
this.model = model;
textPixelPosition = 0;
}

@Override
public void run() {
this.running = true;
while (running) {
model.copyTextPixels(textPixelPosition);
repaint();
sleep();
textPixelPosition++;
textPixelPosition %= model.getTextPixelWidth();
}
}

private void repaint() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.repaintMarqueePanel();
}
});
}

private void sleep() {
try {
Thread.sleep(50L);
} catch (InterruptedException e) {

}
}

public void stopDisplayTextPixelsRunnable() {
this.running = false;
}

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote