// (by Dalubar)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
// solito frame...
class myFrame extends JFrame {
//dimensioni schermo
Dimension dScreen = Toolkit.getDefaultToolkit().getScreenSize();
// costruttore: prende come parametro la stringa da visualizzare
public myFrame() {
setTitle("Text scrolling... (by Dalubar)");
setSize(dScreen.width/2, dScreen.height/4);
setLocation((dScreen.width - getSize().width) / 2,
(dScreen.height - getSize().height) / 2);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// crea e inserisce pannello nel frame
JPanel main = new myPanel();
getContentPane().add(main);
//aggiunge menu...
new menuScrollingText(this);
}
}
class myPanel extends JPanel implements ActionListener {
String msg; Timer tick; FontMetrics fmt;
int i, lower;
Color textColor = Color.BLACK;
boolean flag;
JPanel commandPanel, userPanel;
// costruttore...
public myPanel() {
msg = "";
// crea e avvia un timer (un "tick" ogni 10 ms)
tick = new Timer(10, this);
tick.start();
/* creazione interfaccia utente:
Creazione di due pannelli: uno a NORTH e uno a SOUTH
NORTH: pannello "userPanel" formato da una "label" e una casella di testo.
Gestore layout: FlowLayout.
SOUTH: pannello "commandPanel" formato da 5 radio + 1 bottone
Gestore layout: BorderLayout.
*/
//crea pannello per interfaccia utente e componenti
userPanel = new JPanel();
JLabel lbNome = new JLabel("Digita testo");
final JTextField txNome = new JTextField(25);
JButton btSampleFrase = new JButton("Frase di esempio");
//setta manager di layout x il pannello e inserisce componenti
userPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
userPanel.add(lbNome); userPanel.add(txNome); userPanel.add(btSampleFrase);
//inserisce bordo nel pannello
userPanel.setBorder(BorderFactory.createRaisedBevelBorder());
// crea pannello "sud"
ButtonGroup bg = new ButtonGroup();
commandPanel = new JPanel();
JLabel lbColori = new JLabel("Colori");
lbColori.setFont(new Font("Arial", Font.PLAIN, 20));
commandPanel.add(lbColori);
addRadio("Nero", bg, Color.BLACK);
addRadio("Rosso", bg, Color.RED);
addRadio("Giallo", bg, Color.YELLOW);
addRadio("Magenta", bg, Color.MAGENTA);
addRadio("Blu", bg, Color.BLUE);
addButton("Random", null);
//setta manager di layout x il pannello e inserisce componenti
commandPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
//inserisce bordo nel pannello
commandPanel.setBorder(BorderFactory.createRaisedBevelBorder());
//INSERISCE PANNELLI NEL "JPANEL" CORRENTE
// setta manager di layout x il pannello principale
setLayout(new BorderLayout());
// aggiunge i pannelli in posizione "nord" e "sud"
add(userPanel, BorderLayout.NORTH);
add(commandPanel, BorderLayout.SOUTH);
// classe anonima annidata x rilevare pressioni dei tasti nella JTextField
txNome.getDocument().addDocumentListener(new
DocumentListener() {
/* quando l'utente digita o cancella un tasto,
aggiorno il testo da visualizzare e ricalcolo
la lunchezza in pixel della stringa
*/
public void insertUpdate(DocumentEvent e) {
msg = txNome.getText();
lower = fmt.stringWidth(msg);
}
public void removeUpdate(DocumentEvent e) {
msg = txNome.getText();
lower = fmt.stringWidth(msg);
}
public void changedUpdate(DocumentEvent e) {}
}
);
btSampleFrase.addActionListener( new
ActionListener() {
public void actionPerformed(ActionEvent e) {
//svuota casella di testo
txNome.setText("");
//imposta messaggio
msg = "Chiare, fresche et dolci acque, " +
"ove le belle membra " +
"pose colei che sola a me par donna; " +
"gentil ramo ove piacque " +
"(con sospir' mi rimembra) " +
"a lei di fare al bel fiancho colonna; " +
"herba et fior' che la gonna " +
"leggiadra ricoverse " +
"co l'angelico seno; " +
"aere sacro, sereno, " +
"ove Amor co' begli occhi il cor m'aperse: " +
"date udïenza insieme " +
"a le dolenti mie parole extreme. " +
"S'egli è pur mio destino " +
"e 'l cielo in ciò s'adopra, " +
"ch'Amor quest'occhi lagrimando chiuda, " +
"qualche gratia il meschino " +
"corpo fra voi ricopra, " +
"et torni l'alma al proprio albergo ignuda. " +
"La morte fia men cruda " +
"se questa spene porto " +
"a quel dubbioso passo: " +
"ché lo spirito lasso " +
"non poria mai in piú riposato porto " +
"né in piú tranquilla fossa " +
"fuggir la carne travagliata et l'ossa. " +
"Tempo verrà anchor forse " +
"ch'a l'usato soggiorno " +
"torni la fera bella et mansüeta, " +
"et là 'v'ella mi scorse " +
"nel benedetto giorno, " +
"volga la vista disïosa et lieta, " +
"cercandomi; et, o pietà!, " +
"già terra in fra le pietre " +
"vedendo, Amor l'inspiri " +
"in guisa che sospiri " +
"sí dolcemente che mercé m'impetre, " +
"et faccia forza al cielo, " +
"asciugandosi gli occhi col bel velo. " +
"Da' be' rami scendea " +
"(dolce ne la memoria) " +
"una pioggia di fior' sovra 'l suo grembo; " +
"et ella si sedea " +
"humile in tanta gloria, " +
"coverta già de l'amoroso nembo. " +
"Qual fior cadea sul lembo, " +
"qual su le treccie bionde, " +
"ch'oro forbito et perle " +
"eran quel dí a vederle; " +
"qual si posava in terra, et qual su l'onde; " +
"qual con un vago errore " +
"girando parea dir: - Qui regna Amore. - " +
"Quante volte diss'io " +
"allor pien di spavento: " +
"Costei per fermo nacque in paradiso. " +
"Cosí carco d'oblio " +
"il divin portamento " +
"e 'l volto e le parole e 'l dolce riso " +
"m'aveano, et sí diviso " +
"da l'imagine vera, " +
"ch'i' dicea sospirando: " +
"Qui come venn'io, o quando?; " +
"credendo d'esser in ciel, non là dov'era. " +
"Da indi in qua mi piace " +
"questa herba sí, ch'altrove non ò pace. " +
"Se tu avessi ornamenti quant'ài voglia, " +
"poresti arditamente " +
"uscir del boscho, et gir in fra la gente. " +
"Francesco Petrarca, Canzoniere, CXXVI.";
}
}
);
}
// metodo che aggiunge un bottone al pannello specificato
private void addButton(String label, final Color colore) {
JButton unBottone = new JButton(label);
commandPanel.add(unBottone);
unBottone.addActionListener( new
ActionListener() {
public void actionPerformed(ActionEvent e) {
if (colore != null)
textColor = colore;
else
textColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
}
}
);
}
// metodo che aggiunge un bottone radio al pannello specificato
private void addRadio(String label, ButtonGroup gruppo, final Color colore) {
JRadioButton unRadioBottone = new JRadioButton(label, false);
gruppo.add(unRadioBottone);
commandPanel.add(unRadioBottone);
unRadioBottone.addActionListener( new
ActionListener() {
public void actionPerformed(ActionEvent e) {
textColor = colore;
}
}
);
}
public void actionPerformed(ActionEvent e) {
// decrementa la posizione x del testo...
i -= 2;
if (i < -lower) flag = false;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font title = new Font("Arial black", Font.PLAIN, 28);
if (!flag) {
/* ogni volta che la scritta esce dal frame (a sx)
calcola dimensione stringa in pixel.
*/
fmt = g.getFontMetrics(title);
lower = fmt.stringWidth(msg);
i = getSize().width;
flag = true;
}
g.setFont(title);
g.setColor(textColor);
g.drawString(msg, i, 80);
}
}
class menuScrollingText {
public menuScrollingText(JFrame frame) {
//creazione barra menù
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
//menu File
JMenu fileMenu = new JMenu("File");
JMenuItem exit = fileMenu.add("Uscita");
//menu ?
JMenu helpMenu = new JMenu("?");
JMenuItem help = helpMenu.add("Informazioni...");
//inserimento menu nella barra del menu
menuBar.add(fileMenu);
menuBar.add(helpMenu);
//rilevatori azione per menu
exit.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
);
help.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null,
"Applicazione di esempio\n(by Dalubar)",
"Informazioni...",
JOptionPane.INFORMATION_MESSAGE
);
}
}
);
}
}
// classe "main" di avvio
public class scrollingText2 {
public static void main(String[] args) {
JFrame f = new myFrame();
f.show();
}
}