patternjavaMinor
Java Dice Roller with GUI
Viewed 0 times
rollerwithjavadicegui
Problem
Three days ago I wrote about a Java Dice Roller I wrote. I've now added a GUI to that program. Here it is:
DiceRollerGUI.java:
DiceGUI.java:
ResultGUI.java:
```
package com.egroegnosbig.dicerollergui;
import java.awt.*;
import javax.swing.*;
public class ResultGUI extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
Dice dice = new Dice(6);
int resultInt = dice.roll();
StringBuilder sb = new StringBuilder();
sb
DiceRollerGUI.java:
package com.egroegnosbig.dicerollergui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DiceRollerGUI {
static JFrame frameOne = new JFrame("Dice Roller");
public static void main(String[] args) {
frameOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DiceGUI GUI = new DiceGUI();
frameOne.add(GUI);
Button b = new Button("Roll");
b.addActionListener(new ButtonAction());
frameOne.add(b);
frameOne.setLayout(new GridLayout(1, 2));
frameOne.setSize(400, 250);
frameOne.setResizable(false);
frameOne.setVisible(true);
}
}
class ButtonAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
DiceRollerGUI.frameOne.setVisible(false);
JFrame frameTwo = new JFrame("Dice Roller");
frameTwo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameTwo.setSize(400, 250);
frameTwo.setResizable(false);
ResultGUI resultGUI = new ResultGUI();
frameTwo.add(resultGUI);
frameTwo.setVisible(true);
}
}DiceGUI.java:
package com.egroegnosbig.dicerollergui;
import java.awt.*;
import javax.swing.*;
public class DiceGUI extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
g.drawString("Dice Roller", 70, 20);
}
}ResultGUI.java:
```
package com.egroegnosbig.dicerollergui;
import java.awt.*;
import javax.swing.*;
public class ResultGUI extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
Dice dice = new Dice(6);
int resultInt = dice.roll();
StringBuilder sb = new StringBuilder();
sb
Solution
- Rather than swapping out the entire JFrame for another on the button click, you should simply be updating the contents. This is all very overwrought. I think all you really need is a panel with a button and a label. Click the button, and display the results in the label.
- Related to the above, rather than overriding
paint, you should be using a layout and adding subcomponents.
To get you started:
public class DicePanel extends JPanel {
private final Dice dice;
private JButton rollButton;
private JLabel displayLabel;
public DicePanel(Dice dice) {
this.dice = dice;
rollButton = new JButton("Roll");
displayLabel = new JLabel();
rollButton.addActionListener(e ->
displayLabel.setText("You rolled a: " + dice.roll())
);
// or if you're not using Java 8, you can do the more verbose thing.
// not specifying a layout defaults to a flow layout. Set a layout via:
// setLayout(new BorderLayout()); // or whatever
add(rollButton);
add(displayLabel);
}
}Your program should just create a
Dice, create a DicePanel with that, and stick it in a JFrame and show it. Then play around with layouts to get something you like.Code Snippets
public class DicePanel extends JPanel {
private final Dice dice;
private JButton rollButton;
private JLabel displayLabel;
public DicePanel(Dice dice) {
this.dice = dice;
rollButton = new JButton("Roll");
displayLabel = new JLabel();
rollButton.addActionListener(e ->
displayLabel.setText("You rolled a: " + dice.roll())
);
// or if you're not using Java 8, you can do the more verbose thing.
// not specifying a layout defaults to a flow layout. Set a layout via:
// setLayout(new BorderLayout()); // or whatever
add(rollButton);
add(displayLabel);
}
}Context
StackExchange Code Review Q#106034, answer score: 2
Revisions (0)
No revisions yet.