Hallo, Ich bin im Internet über einen Quelltext für einen SpeedReader gestolpert und wollte nun probieren noch einen Button zum ändern der Schriftart einzufügen was mir jedoch nach mehreren Anläufen nicht gelungen ist. Nun bin ich hier gelandet und bitte um Hilfe das Problem zu lösen ![Big grin :D :D](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f600.png)
Bin noch recht unerfahren mit Java und bin daher auch für Verbesserungsvorschläge als auch Tipps offen ^^
![Big grin :D :D](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f600.png)
Bin noch recht unerfahren mit Java und bin daher auch für Verbesserungsvorschläge als auch Tipps offen ^^
Code:
package reader;
import javax.swing.*; //used for user interface
import javax.swing.text.SimpleAttributeSet; //used for changing fonts
import javax.swing.text.StyleConstants; //text styles
import javax.swing.text.StyledDocument; //text styles
import java.awt.*;
import java.awt.event.ActionListener; //listens for mouse clicks on buttons
import java.awt.event.ActionEvent; //handles button press events
import java.io.FileNotFoundException; //handles file exceptions
import java.io.FileReader; //file reader for file input
import java.util.Scanner; //scanner for input
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Reader {
JFrame guiFrame; //initiate main window frame
JPanel optPanel; //initiate option panel
JFileChooser fileDialog; //initiate fileDialog
JTextPane textPane; //initiate textPane
int pause = 265; //set initial reading speed to 200wpm
int f = 1; //tracks the colour scheme
String filePath; //holds location of the selected file
public static void main(String[] args) {
//Use the event dispatch thread for Swing components
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
new Reader();
}
});
}
public Reader() //Create JFrame and all components
{
guiFrame = new JFrame(); //create new instance of the main window
guiFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //program will exit if window closed
guiFrame.setTitle("Reader Window"); //title of main window
guiFrame.setSize(500,200); //set the size of the main window
guiFrame.setLocationRelativeTo(null); //put the window in the middle of the screen
guiFrame.setLayout(new BorderLayout()); //initiate layout of guiframe
fileDialog = new JFileChooser();//"C:\\Documents and Settings\\Owner\\My Documents" used to select file to read
textPane = new JTextPane(); //create new instance of the textpane
textPane.setEditable(false); //user cannot edit text in textpane
Font font = new Font("Serif", Font.BOLD, 22); //set font and size
textPane.setFont(font); //set font of textpane
StyledDocument doc = textPane.getStyledDocument(); //styled document allows allignment options
SimpleAttributeSet center = new SimpleAttributeSet(); //attribute set to control center alignment
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); //Align text to the center
doc.setParagraphAttributes(0, doc.getLength(), center, false); //set formatting options
textPane.setText("Choose a speed, open a file and start reading"); //initial contents of textpane
textPane.setVisible(true); //set textpane to visible
guiFrame.add(textPane, BorderLayout.CENTER); //add textpane with word output in center to guiframe
optPanel = new JPanel(); //add an instance of optPanel
optPanel.setLayout(new GridLayout(1,3)); //set layout of buttons 1 high by 3 wide
guiFrame.add(optPanel,BorderLayout.NORTH); //Put the buttons at the bottom of the window
JButton openButton = new JButton("Open File"); //Create new button
openButton.setActionCommand("Open File");
openButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{ //event happens if file button pressed
try {
openFile(); //call open file method to display file selection window
} catch (Exception e) { //catch exception
e.printStackTrace(); //used to identify problems
}
}
});
optPanel.add(openButton); //add open file button to option panel
JButton speedButton = new JButton("Select WPM"); //Create new button
speedButton.setActionCommand("Select WPM");
speedButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{ //event happens if user clicks button
try {
setSpeed(); //call set speed method to display speed window
} catch (Exception e) { //catch exception
e.printStackTrace(); //used to identify problems
}
}
});
optPanel.add(speedButton); //Add speed selection button to option panel
JButton changeColours = new JButton("change color"); //Add button to invert colour scheme
changeColours.setActionCommand("change color");
changeColours.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { //event happens when user clicks button---
try {
if (f == 1) { //check the current color settings. Currently black on white
textPane.setForeground(Color.blue); //set text colour to white
f = 0; //tracks colour settings
} else { //check the current color settings. currently white on black
textPane.setForeground(Color.green);
f = 1; //tracks colour settings
}
} catch (Exception e) { //catch exception
e.printStackTrace(); //used to identify problems
}
}
});
optPanel.add(changeColours); //add the colour button to option panel
JSpinner changeFontSize = new JSpinner(
new SpinnerNumberModel(22, 10, 78, 2));
changeFontSize.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
textPane.setFont(textPane.getFont().deriveFont(
((Number)changeFontSize.getValue()).floatValue()));
}
});
optPanel.add(changeFontSize);
guiFrame.setVisible(true);
}
//Show a open file dialog box
private void openFile() throws Exception { //exception needed to handle files
int openChoice = fileDialog.showOpenDialog(guiFrame); //display file chooser window
if (openChoice == JFileChooser.APPROVE_OPTION){ //user selects a file from file chooser window
filePath = fileDialog.getSelectedFile().getPath(); //set filepath as the path of the file selected in the filedialog window
(new Thread(new displayText())).start(); //Start displayText method in separate thread to avoid gui freeze
}
}
private void setSpeed(){ //Method called if speed button pressed
String[] speeds = { "200", "300", "500", "800" }; //String holds values for drop down box
JFrame frame = new JFrame("Input required speed in words per minute"); //new frame to select speed
String speedChoice = (String) JOptionPane.showInputDialog(frame, //option pane used for easy speed selection
"What speed would you like?", //display question to user
"WPM", //window title
JOptionPane.QUESTION_MESSAGE, //standard for option pane
null,
speeds, //add the string of speeds as options
speeds[0]); //default is 200
if(speedChoice.equals("200"))
pause = 265; //187 words in 59.877s that's 187.38414wpm (without natural reading pauses)
else if(speedChoice.equals("300"))
pause = 160; //187 words in 38.522s that's 291.26215wpm (without natural reading pauses)
else if(speedChoice.equals("500"))
pause = 75; //187 words in 22.451s that's 499.75504wpm (without natural reading pauses)
else if(speedChoice.equals("800"))
pause = 28; //187 words in 14.006s that's 801.08527wpm (without natural reading pauses)
}
public class displayText implements Runnable { //Run all the display text method within its own thread. Prevents the GUI from becoming unresponsive
public void run(){
Scanner in = null; //Scanner to read the file at chosen location
try {
in = new Scanner(new FileReader(filePath));
} catch (FileNotFoundException e) { //ignore exception
e.printStackTrace(); //used to identify problems
}
int i =0; //Number of words in document
while(in.hasNextLine()){ //read every line of file
in.next(); //move to next word
i++; //increment word counter
}
in.close(); //Close Scanner after words have been counted
try {
in = new Scanner(new FileReader(filePath)); //New Scanner to start at top of file
} catch (FileNotFoundException e) { //ignore exception
e.printStackTrace(); //used to identify problems
}
String[] word = new String[i]; //Array stores each word
int n = 0;
long start =0, end; //used to calculate words per minute
float time; //will hold time taken to finish article
float wPM; //will hold number of words per minute
for(int k=0; k<i; k++){ //loop cycles through every word in file
//FROM HERE
if(k==0){ //check if at start of loop
start = System.currentTimeMillis(); //Start time used to calculate words per minute
}
else if(k==(i-1)){ //check if at end of loop
end = System.currentTimeMillis(); //end time used to calculate words per minute
time = (end-start); //time taken = end time - start time
wPM = (60/(time/1000))*i; //words per minute = time in minutes * words read
System.out.println(i + " words in " + (time/1000) + "s" + " that's " + wPM + "wpm"); //print results in system dialog
}
//TO HERE is just used to show how many words were read. Used to calculate how much pause to set.
word[k] = in.next(); //get next word from file
//Natural reading speeds and pauses attempt (needs research)
if(word[k].length()>=5 && word[k].length()<=8) n = 100; //short pause for words with 5-8 characters
else if(word[k].length()>=9 && word[k].length()<=12) n = 150; //medium pause for words with 9-12 characters
else if(word[k].length()>12) n = 200; //long pause for words over 12 characters
for(int j=0; j<word[k].length(); j++){ //loop cycles through length of word
if(word[k].charAt(word[k].length()-1) == '.') //Add pause after a full stop
n += 50;
if(word[k].charAt(word[k].length()-1) == ',') //Add slight pause after a comma
n += 30;
}
textPane.setText(word[k]); //Set the word in the text pane to the word read from file
sleep(pause+n); //call sleep method to add a pause after the word. n adds custom pause
n=0; //n set back to 0 after each word
}
}
}
private void sleep(int i) { //Adds a pause between words. i changes length of pause
try {
Thread.sleep(i); //sleep thread for pause+n milliseconds
} catch(InterruptedException e) { //exception needed for sleep
//do nothing
}
}
}