View Full Version : [Java] Aggiunta di scrollbar ad una finestra
Sera a tutti, come avevo già detto in un precedente post sono ai primi passi con java e mi trovo davanti ad un problema che non riesco a risolvere.
Se io creo una finestra in questo modo:
import java.awt.*;
import javax.swing.*;
public class Prova extends JFrame {
public static void main(String[] a) {
Prova Finestra = new Prova();
}
public Prova() {
super ("TITOLO");
setSize(1000, 500);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
g.drawString("testo qualunque",10,100);
}
}
Come posso fare ad aggiungere delle scrollbar con JScrollpane? Vorrei avere diciamo una finestra che scorre in verticale all'infinito mano a mano che inserisco imput e ottengo risposte dal software (in pratica come avviene con il terminale).
Grazie dell'attenzione. :)
sottovento
14-01-2014, 07:40
JScrollPane e' stato pensato per "avvolgere" un controllo, cosi' che se le sue dimensioni superano quelle della finestra, le barre di scorrimento appaiano correttamente.
Nell'applicazione che hai scritto, sei andato a fare l'override del metodo paint() per scrivere un testo. Non e' il metodo "standard" per costruire un'interfaccia grafica, a meno che tu non abbia bisogno di disegnare direttamente sul frame.
Se il tuo scopo e', per esempio, quello di emulare un terminale cosi' come hai spiegato, potresti modificare il programma semplicemente cosi':
import java.awt.*;
import javax.swing.*;
public class Prova extends JFrame
{
public static void main(String[] a)
{
SwingConstants.invokeLater( new Runnable()
{
@Override
public void run()
{
Prova Finestra = new Prova();
}
});
}
public Prova()
{
super ("TITOLO");
setSize(1000, 500);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textArea = new JTextArea(); /* Questa e' l'area di testo */
getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER);
setVisible(true);
}
}
la variabile textArea conterra' il testo che l'utente inserisce (o che vuoi visualizzare: ti basta inserirlo usando la setText()).
Spero di aver risposto alla tua domanda. Ciao
[...] Spero di aver risposto alla tua domanda. Ciao
Ciao! Si credo proprio che utilizzando la textarea tutto funzioni. Solo che il mio compilatore mi restituisce un errore riguardo alla riga 7:
SwingConstants.invokeLater( new Runnable()
però sostituendola con;
EventQueue.invokeLater(new Runnable()
sembra funzionare.
sottovento
14-01-2014, 20:53
Ciao! Si credo proprio che utilizzando la textarea tutto funzioni. Solo che il mio compilatore mi restituisce un errore riguardo alla riga 7:
SwingConstants.invokeLater( new Runnable()
però sostituendola con;
EventQueue.invokeLater(new Runnable()
sembra funzionare.
Vabbe' sono un asino. Devi sostituire SwingConstants (o EventQueue) con SwingUtilities. Poi un giorno prestero' anche attenzione a quello che scrivo
Perfetto grazie! Comunque in giro per la rete ho trovato un ottimo vecchio esempio per creare una textarea sempre fatto da te:
http://www.hwupgrade.it/forum/archive/index.php/t-2543643.html
Modificandolo un peletto sono riuscito ad ottenere la finestra con il font modificato colorato ed ingrandito ecc... insomma tutto quello che volevo... l'unica pecca è che non riesco ad impostarli solo per una determinata riga ma solamente per tutto il testo.
Il codice è:
import java.awt.*;
import javax.swing.*;
class MyConsole extends JFrame
{
private JTextArea ta;
public MyConsole()
{
setSize(800, 600);
setTitle("My console");
buildGUI();
}
private void buildGUI()
{
ta = new JTextArea();
getContentPane().add(new JScrollPane(ta), BorderLayout.CENTER);
Font font = new Font("Verdana", Font.BOLD, 12); // AGGIUNTA MIA DEL FONT
ta.setFont(font); // AGGIUNTA MIA DEL FONT
ta.setForeground(Color.BLUE); // AGGIUNTA MIA DEL COLORE
}
public void print (String str)
{
ta.append(str);
}
public void println(String str)
{
ta.append (str + "\n");
}
public static void main(String[] args)
{
MyConsole myConsole = new MyConsole();
myConsole.setVisible(true);
myConsole.println ("Ciao da sottovento");
myConsole.println ("Oggi e' il mio compleanno");
}
}
sottovento
15-01-2014, 07:40
<CUT>
Modificandolo un peletto sono riuscito ad ottenere la finestra con il font modificato colorato ed ingrandito ecc... insomma tutto quello che volevo... l'unica pecca è che non riesco ad impostarli solo per una determinata riga ma solamente per tutto il testo.
<CUT>
Si, JTextArea serve per visualizzare del testo. Se vuoi delle funzionalita' piu' sofisticate, come quella che vuoi implementare, devi cambiare componente ed utilizzare JEditorPane, il quale puo' visualizzare testo "plain", RTF e html.
Funziona piu' o meno come JTextArea, devi pero' specificargli il tipo di stringa che gli passerai mediante setContentType(String tipo), dove tipo puo' essere
"text/plain", "text/rtf", "text/html".
Per esempio, potresti settare "text/html" e passare una stringa del tipo
"<html><body><font color=red>ciao</font><font color=blue> da sottovento</font></body></html>" utilizzando la setText(), esattamente come JTextArea.
Ok, sono riuscito a creare una JTextPane (un po' a modo mio probabilmente...) con due tipologie di formattazione del testo. Riporto in breve il codice:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class Prova
{
public static void main(String args[]) {
JFrame Cornice = new JFrame("Simple Attributes");
Container Contenitore = Cornice.getContentPane();
Cornice.setSize(1000, 500);
Cornice.setVisible(true);
StyledDocument Stile = new DefaultStyledDocument();
JTextPane RiquadroDiTesto = new JTextPane(Stile);
RiquadroDiTesto.setEditable(false);
JScrollPane scrollPane = new JScrollPane(RiquadroDiTesto);
Contenitore.add(scrollPane, BorderLayout.CENTER);
SimpleAttributeSet FormattazioneTitolo = new SimpleAttributeSet();
FormattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE);
FormattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE);
SimpleAttributeSet FormattazioneCorpo = new SimpleAttributeSet();
FormattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.FALSE);
FormattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.FALSE);
FormattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Foreground, Color.lightGray);
try {
Stile.insertString(Stile.getLength(),"Scegli tra le seguenti opzioni:", FormattazioneCorpo);
Stile.insertString(Stile.getLength(),"0", FormattazioneCorpo);
Stile.insertString(Stile.getLength(),"1", FormattazioneCorpo);
Stile.insertString(Stile.getLength(),"2", FormattazioneCorpo);
Stile.insertString(Stile.getLength(),": ", FormattazioneCorpo);
String InputOpzione = JOptionPane.showInputDialog ("Inserisci una delle opzioni");
switch (InputOpzione) {
case "0":
break;
case "1":
break;
case "2":
break;
default:
break;
}
} catch(Exception e) {
}
}
}
Ora gli unici dubbi che ho sono: fare in modo che ogni stringa testuale che viene visualizzata sia su una riga separata (come con println per intendersi) e, se possibile, fare in modo di poter inserire l'input di scelta direttamente nella finestra del programma senza far apparire il popup.
Grazie dei consigli che mi hai dato fin'ora ;)
sottovento
16-01-2014, 09:14
Ciao
senti, non me ne volere ma mi sono permesso di modificare il tuo codice, cercando implementare quello che desideri fare.
Ho fatto diverse modifiche, incluso il nome delle varibili: in Java i nomi delle variabili (locali e membro) cominciano con la lettera minuscola e se sono composte da piu' parole, le iniziali delle parole successive sono maiuscole.
E' una convenzione cosi' radicata in Java che tutti i programmatori si aspettano questo, pertanto mi sono permesso di adeguare il tuo codice.
Ho fatto diverse modifiche. Commentarle tutte mi sembra piuttosto lungo e magari inutile, visto che probabilmente conosci la maggior parte delle cose.
Pertanto metto qui il codice e cerchero' di rispondere alle eventuali domande.
Buona giornata
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class Prova
{
public Prova()
{
JFrame cornice = new JFrame("Simple Attributes");
cornice.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Sottovento
Container contenitore = cornice.getContentPane();
cornice.setSize(1000, 500);
cornice.setVisible(true);
//StyledDocument stile = new DefaultStyledDocument(); Sottovento - commento per rimuovere
JTextPane riquadroDiTesto = new JTextPane();
//riquadroDiTesto.setEditable(false);
final StyledDocument stile = riquadroDiTesto.getStyledDocument();
JScrollPane scrollPane = new JScrollPane(riquadroDiTesto);
contenitore.add(scrollPane, BorderLayout.CENTER);
final SimpleAttributeSet formattazioneTitolo = new SimpleAttributeSet();
formattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE);
formattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE);
final SimpleAttributeSet formattazioneCorpo = new SimpleAttributeSet();
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.FALSE);
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.FALSE);
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Foreground, Color.lightGray);
JPanel southPanel = new JPanel();
GridBagLayout layout = new GridBagLayout();
southPanel.setLayout(layout);
JLabel lbl = new JLabel ("<html><body><Font color=red>Scegli tra le seguenti opzioni:0,1,2</font></body></html>");
addBag(southPanel, layout, lbl, 0, 0, 0.0, 0.0, GridBagConstraints.NONE, 1, 1);
final JTextField tfInput = new JTextField();
addBag(southPanel, layout, tfInput, 1, 0, 1.0, 0.0, GridBagConstraints.HORIZONTAL, 1, 1);
JButton btnGo = new JButton("Scrivi");
btnGo.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent evt)
{
try
{
String text = tfInput.getText();
if (text != null && text.length() > 0)
stile.insertString (stile.getLength(), text + "\n", formattazioneCorpo);
}
catch(BadLocationException e)
{
e.printStackTrace(System.out); // Sottovento - altrimenti non si puo' sapere se c'e' qualche problema...
}
}
});
addBag(southPanel, layout, btnGo, 2, 0, 0.0, 0.0, GridBagConstraints.NONE, 1, 1);
contenitore.add(southPanel, BorderLayout.SOUTH);
try
{
stile.insertString(0,"Scegli tra le seguenti opzioni:\n", formattazioneCorpo); // Sottovento - 0 invece di stile.getLength()
stile.insertString(stile.getLength(),"0", formattazioneCorpo);
stile.insertString(stile.getLength(),"1", formattazioneCorpo);
stile.insertString(stile.getLength(),"2", formattazioneCorpo);
stile.insertString(stile.getLength(),": \n", formattazioneCorpo);
// String inputOpzione = JOptionPane.showInputDialog ("Inserisci una delle opzioni");
// switch (inputOpzione)
// {
// case "0":
// break;
// case "1":
// break;
// case "2":
// break;
// default:
// break;
// }
}
catch(BadLocationException e)
{
e.printStackTrace(System.out); // Sottovento - altrimenti non si puo' sapere se c'e' qualche problema...
}
}
private void addBag(JPanel panel, GridBagLayout layout, JComponent component, int gridx, int gridy, double weightx, double weighty, int fill, int gridWidth, int gridHeight)
{
GridBagConstraints limits = new GridBagConstraints();
limits.gridx = gridx;
limits.gridy = gridy;
limits.anchor = GridBagConstraints.WEST;
limits.insets.top = 1;
limits.insets.bottom = 1;
limits.insets.left = 2;
limits.insets.right = 2;
limits.weightx = weightx;
limits.weighty = weighty;
limits.fill = fill;
limits.gridwidth = gridWidth;
limits.gridheight = gridHeight;
layout.setConstraints(component, limits);
panel.add(component);
}
public static void main(String args[])
{
SwingUtilities.invokeLater (new Runnable()
{
@Override
public void run()
{
new Prova();
}
});
}
}
Figurati le tue modifiche al mio codice "abbozzato" sono sempre gradite. Comunque testandolo devo dire che lo scopo è quasi raggiunto, solo che non riesco a fare in modo di poter sfruttare gli input inseriti nel campo di scrittura in basso per navigare tra le opzioni.
Ad esempio: a schermo mi compare "scegli opzione 1,2,3", io digito "2", premo il bottone "Scrivi" e vengono eseguite le istruzioni in 2 e mostrati eventuali altri sottomenù a cui poter accedere sempre con gli input nella textfield in basso.
Ovvero quello che accade con questo codice privo di interfaccia:
import java.util.Scanner;
public class prova{
public static void main(String[] args) {
System.out.println ("Scegli tra le seguenti opzioni:");
System.out.println ("1 - opzione 1");
System.out.println ("2 - opzione 2");
System.out.println ("3 - opzione 3");
System.out.print(": ");
Scanner inputopzione = new Scanner(System.in);
switch (inputopzione.nextInt()) {
case 1: System.out.println("opzione 1");
System.out.println ("Scegli tra le seguenti opzioni:");
System.out.println ("1 - opzione 1");
System.out.println ("2 - opzione 2");
System.out.println ("3 - opzione 3");
switch (inputopzione.nextInt()) {
case 1: System.out.println("opzione 1");
System.out.println ("prova");
break;
case 2: System.out.println("opzione 2");
System.out.println ("prova");
break;
case 3: System.out.println("opzione 3");
System.out.println ("prova");
break;
default: System.out.println("Error");
break;
}
break;
case 2: System.out.println("opzione 2");
System.out.println ("prova");
break;
case 3: System.out.println("opzione 3");
System.out.println ("prova");
break;
default: System.out.println("Error");
break;
}
}
}
Nel mio codice vecchio avevo fatto in questo modo:
String InputOpzione = JOptionPane.showInputDialog ("Inserisci una delle opzioni");
switch (InputOpzione) {
case "0":
// istruzioni ed eventuali sotto switch
break;
case "1":
// istruzioni ed eventuali sotto switch
break;
case "2":
// istruzioni ed eventuali sotto switch
break;
default:
// istruzioni
break;
}
Ma se è possibile sfruttare la textfield che hai posizionato in fondo alla finestra sarebbe ancora meglio
sottovento
16-01-2014, 16:37
Figurati le tue modifiche al mio codice "abbozzato" sono sempre gradite. Comunque testandolo devo dire che lo scopo è quasi raggiunto, solo che non riesco a fare in modo di poter sfruttare gli input inseriti nel campo di scrittura in basso per navigare tra le opzioni.
Ad esempio: a schermo mi compare "scegli opzione 1,2,3", io digito "2", premo il bottone "Scrivi" e vengono eseguite le istruzioni in 2 e mostrati eventuali altri sottomenù a cui poter accedere sempre con gli input nella textfield in basso.
Quindi all'inserimento delle opzioni 1,2 o 3 vuoi compiere delle azioni differenti.
Domanda: e' necessaria questo tipo di interfaccia grafica?
Come ben sai il problema e' facilmente risolvibile mediante altre modalita': per esempio, un menu nella menu bar, una combo box invece del text field, dei bottoni posizionati nella tool bar, ....
Ho fatto quell'esempio perche' pensavo che il problema fosse gestire la JEditorPane/JTextPane, ma se desideri costruire un'interfaccia grafica per risolvere il problema in questione, forse e' meglio ripensarla usando menu' e/o bottoni.
Domanda: e' necessaria questo tipo di interfaccia grafica?
Nono va bene qualunque interfaccia permetta di ottenere lo scopo
sottovento
17-01-2014, 09:18
Nono va bene qualunque interfaccia permetta di ottenere lo scopo
Scusa il ritardo, ma sto per essere trasferito un'altra volta, e stavolta in pieno deserto. Se non mi senti piu' e' a causa della connessione (i.e. dove vado non ci sono case ne' negozi, nulla. Solo sabbia) visto che dovro' affidarmi al cellulare.
Mi sono permesso di modificare il codice un'altra volta. A titolo di esempio, ho inserito una barra dei menu con un solo menu, contentente le 3 opzioni che ti interessano. Ho anche introdotto una combo box, cosi' vedi un altro modo di selezionare i dati. Avrei voluto anche inserire una toolbar, ma mi servirebbero 3 icone (possibilmente della stessa dimensione) e non so come pubblicarle sul forum.
Ad ogni modo, dacci un'occhiata e fammi sapere se e' quello che ti interessa.
Per inciso: esistono 1000 soluzioni al problema, ho cercato di presentare quella che secondo me e' piu' intuitiva e che piu' si adatta allo stile del programma che hai impostato.
ciau
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class Prova implements ActionListener
{
private SimpleAttributeSet formattazioneCorpo;
private SimpleAttributeSet formattazioneTitolo;
private StyledDocument stile;
private JComboBox<String> cmbOptions;
public Prova()
{
JFrame cornice = new JFrame("Simple Attributes");
cornice.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Sottovento
Container contenitore = cornice.getContentPane();
cornice.setSize(1000, 500);
cornice.setVisible(true);
//StyledDocument stile = new DefaultStyledDocument(); Sottovento - commento per rimuovere
JTextPane riquadroDiTesto = new JTextPane();
//riquadroDiTesto.setEditable(false);
stile = riquadroDiTesto.getStyledDocument();
JScrollPane scrollPane = new JScrollPane(riquadroDiTesto);
contenitore.add(scrollPane, BorderLayout.CENTER);
formattazioneTitolo = new SimpleAttributeSet();
formattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE);
formattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE);
formattazioneCorpo = new SimpleAttributeSet();
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.FALSE);
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.FALSE);
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Foreground, Color.lightGray);
JPanel southPanel = new JPanel();
GridBagLayout layout = new GridBagLayout();
southPanel.setLayout(layout);
JLabel lbl = new JLabel ("<html><body><Font color=red>Scegli tra le seguenti opzioni:0,1,2</font></body></html>");
addBag(southPanel, layout, lbl, 0, 0, 0.0, 0.0, GridBagConstraints.NONE, 1, 1);
String[] options =
{
"Opzione 1",
"Opzione 2",
"Opzione 3"
};
cmbOptions = new JComboBox<> (options);
cmbOptions.setActionCommand("ComboSelected");
cmbOptions.addActionListener(this);
addBag(southPanel, layout, cmbOptions, 1, 0, 1.0, 0.0, GridBagConstraints.HORIZONTAL, 1, 1);
contenitore.add(southPanel, BorderLayout.SOUTH);
try
{
stile.insertString(0,"Scegli tra le seguenti opzioni:\n", formattazioneCorpo); // Sottovento - 0 invece di stile.getLength()
stile.insertString(stile.getLength(),"0", formattazioneCorpo);
stile.insertString(stile.getLength(),"1", formattazioneCorpo);
stile.insertString(stile.getLength(),"2", formattazioneCorpo);
stile.insertString(stile.getLength(),": \n", formattazioneCorpo);
}
catch(BadLocationException e)
{
e.printStackTrace(System.out); // Sottovento - altrimenti non si puo' sapere se c'e' qualche problema...
}
addMenuBar(cornice);
}
// Aggiunge la barra a menu ed un menu contente le opzioni che ti interessano
private void addMenuBar(JFrame cornice)
{
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Opzioni");
JMenuItem item1 = new JMenuItem("Opzione 1");
item1.setActionCommand("Option1"); /* Questa e' la stringa che identifica il comando */
item1.addActionListener(this);
menu.add(item1);
JMenuItem item2 = new JMenuItem("Opzione 2");
item2.setActionCommand("Option2"); /* Questa e' la stringa che identifica il comando */
item2.addActionListener(this);
menu.add(item2);
JMenuItem item3 = new JMenuItem("Opzione 3");
item3.setActionCommand("Option3"); /* Questa e' la stringa che identifica il comando */
item3.addActionListener(this);
menu.add(item3);
menuBar.add(menu);
cornice.setJMenuBar(menuBar);
}
private void addBag(JPanel panel, GridBagLayout layout, JComponent component, int gridx, int gridy, double weightx, double weighty, int fill, int gridWidth, int gridHeight)
{
GridBagConstraints limits = new GridBagConstraints();
limits.gridx = gridx;
limits.gridy = gridy;
limits.anchor = GridBagConstraints.WEST;
limits.insets.top = 1;
limits.insets.bottom = 1;
limits.insets.left = 2;
limits.insets.right = 2;
limits.weightx = weightx;
limits.weighty = weighty;
limits.fill = fill;
limits.gridwidth = gridWidth;
limits.gridheight = gridHeight;
layout.setConstraints(component, limits);
panel.add(component);
}
@Override
public void actionPerformed (ActionEvent evt)
{
String command = evt.getActionCommand();
if (command == null)
return; /* Fai in modo che non accada mai! */
try
{
switch (command)
{
case "Option1": /* Opzione 1 selezionata. Fai qualcosa qui! */
stile.insertString(stile.getLength(),"Hai selezionato l'opzione 1\n", formattazioneCorpo);
break;
case "Option2": /* Opzione 2 selezionata. Fai qualcosa qui! */
stile.insertString(stile.getLength(),"Ti ho visto, sai! Hai selezionato l'opzione 2\n", formattazioneCorpo);
break;
case "Option3": /* Opzione 3 selezionata. Fai qualcosa qui! */
stile.insertString(stile.getLength(),"Allora e' un vizio! Hai selezionato l'opzione 3\n", formattazioneCorpo);
break;
case "ComboSelected": /* Selezionato qualcosa al combo box */
{
String selectedItem = (String)cmbOptions.getSelectedItem();
if (selectedItem != null)
stile.insertString(stile.getLength(), "Hai selezionato \"" + selectedItem + "\" dalla combo box\n", formattazioneCorpo);
}
break;
}
}
catch(BadLocationException e)
{
e.printStackTrace(System.out);
System.out.println ("Non posso portare a termine il comando a causa dell'eccezione " + e);
}
}
public static void main(String args[])
{
SwingUtilities.invokeLater (new Runnable()
{
@Override
public void run()
{
new Prova();
}
});
}
}
Scusa il ritardo, ma sto per essere trasferito un'altra volta, e stavolta in pieno deserto. Se non mi senti piu' e' a causa della connessione (i.e. dove vado non ci sono case ne' negozi, nulla. Solo sabbia) visto che dovro' affidarmi al cellulare.
Figurati ci mancherebbe altro!
Il tuo codice funziona bene, solo che non capisco come fare ad entrare nei casi che ti evidenzio in rosso, visto che il caso che ti evidenzio in verde pare raccogliere tutte e tre i comandi:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class Prova implements ActionListener
{
private SimpleAttributeSet formattazioneCorpo;
private SimpleAttributeSet formattazioneTitolo;
private StyledDocument stile;
private JComboBox<String> cmbOptions;
public Prova()
{
JFrame cornice = new JFrame("Simple Attributes");
cornice.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Sottovento
Container contenitore = cornice.getContentPane();
cornice.setSize(1000, 500);
cornice.setVisible(true);
//StyledDocument stile = new DefaultStyledDocument(); Sottovento - commento per rimuovere
JTextPane riquadroDiTesto = new JTextPane();
//riquadroDiTesto.setEditable(false);
stile = riquadroDiTesto.getStyledDocument();
JScrollPane scrollPane = new JScrollPane(riquadroDiTesto);
contenitore.add(scrollPane, BorderLayout.CENTER);
formattazioneTitolo = new SimpleAttributeSet();
formattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE);
formattazioneTitolo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE);
formattazioneCorpo = new SimpleAttributeSet();
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.FALSE);
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.FALSE);
formattazioneCorpo.addAttribute(StyleConstants.CharacterConstants.Foreground, Color.lightGray);
JPanel southPanel = new JPanel();
GridBagLayout layout = new GridBagLayout();
southPanel.setLayout(layout);
JLabel lbl = new JLabel ("<html><body><Font color=red>Scegli tra le seguenti opzioni:0,1,2</font></body></html>");
addBag(southPanel, layout, lbl, 0, 0, 0.0, 0.0, GridBagConstraints.NONE, 1, 1);
String[] options =
{
"Opzione 1",
"Opzione 2",
"Opzione 3"
};
cmbOptions = new JComboBox<> (options);
cmbOptions.setActionCommand("ComboSelected");
cmbOptions.addActionListener(this);
addBag(southPanel, layout, cmbOptions, 1, 0, 1.0, 0.0, GridBagConstraints.HORIZONTAL, 1, 1);
contenitore.add(southPanel, BorderLayout.SOUTH);
try
{
stile.insertString(0,"Scegli tra le seguenti opzioni:\n", formattazioneCorpo); // Sottovento - 0 invece di stile.getLength()
stile.insertString(stile.getLength(),"0", formattazioneCorpo);
stile.insertString(stile.getLength(),"1", formattazioneCorpo);
stile.insertString(stile.getLength(),"2", formattazioneCorpo);
stile.insertString(stile.getLength(),": \n", formattazioneCorpo);
}
catch(BadLocationException e)
{
e.printStackTrace(System.out); // Sottovento - altrimenti non si puo' sapere se c'e' qualche problema...
}
addMenuBar(cornice);
}
// Aggiunge la barra a menu ed un menu contente le opzioni che ti interessano
private void addMenuBar(JFrame cornice)
{
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Opzioni");
JMenuItem item1 = new JMenuItem("Opzione 1");
item1.setActionCommand("Option1"); /* Questa e' la stringa che identifica il comando */
item1.addActionListener(this);
menu.add(item1);
JMenuItem item2 = new JMenuItem("Opzione 2");
item2.setActionCommand("Option2"); /* Questa e' la stringa che identifica il comando */
item2.addActionListener(this);
menu.add(item2);
JMenuItem item3 = new JMenuItem("Opzione 3");
item3.setActionCommand("Option3"); /* Questa e' la stringa che identifica il comando */
item3.addActionListener(this);
menu.add(item3);
menuBar.add(menu);
cornice.setJMenuBar(menuBar);
}
private void addBag(JPanel panel, GridBagLayout layout, JComponent component, int gridx, int gridy, double weightx, double weighty, int fill, int gridWidth, int gridHeight)
{
GridBagConstraints limits = new GridBagConstraints();
limits.gridx = gridx;
limits.gridy = gridy;
limits.anchor = GridBagConstraints.WEST;
limits.insets.top = 1;
limits.insets.bottom = 1;
limits.insets.left = 2;
limits.insets.right = 2;
limits.weightx = weightx;
limits.weighty = weighty;
limits.fill = fill;
limits.gridwidth = gridWidth;
limits.gridheight = gridHeight;
layout.setConstraints(component, limits);
panel.add(component);
}
@Override
public void actionPerformed (ActionEvent evt)
{
String command = evt.getActionCommand();
if (command == null)
return; /* Fai in modo che non accada mai! */
try
{
switch (command)
{
case "Option1": /* Opzione 1 selezionata. Fai qualcosa qui! */
stile.insertString(stile.getLength(),"Hai selezionato l'opzione 1\n", formattazioneCorpo);
break;
case "Option2": /* Opzione 2 selezionata. Fai qualcosa qui! */
stile.insertString(stile.getLength(),"Ti ho visto, sai! Hai selezionato l'opzione 2\n", formattazioneCorpo);
break;
case "Option3": /* Opzione 3 selezionata. Fai qualcosa qui! */
stile.insertString(stile.getLength(),"Allora e' un vizio! Hai selezionato l'opzione 3\n", formattazioneCorpo);
break;
case "ComboSelected": /* Selezionato qualcosa al combo box */
{
String selectedItem = (String)cmbOptions.getSelectedItem();
if (selectedItem != null)
stile.insertString(stile.getLength(), "Hai selezionato \"" + selectedItem + "\" dalla combo box\n", formattazioneCorpo);
}
break;
}
}
catch(BadLocationException e)
{
e.printStackTrace(System.out);
System.out.println ("Non posso portare a termine il comando a causa dell'eccezione " + e);
}
}
public static void main(String args[])
{
SwingUtilities.invokeLater (new Runnable()
{
@Override
public void run()
{
new Prova();
}
});
}
}
Grazie delle correzioni e buona fortuna per il trasferimento in PostoDimenticatoDaDio!
sottovento
17-01-2014, 14:26
Entri nella zona rossa alla selezione di una voce dei menu.
Avrai notato che per ogni voce del menu' ho chiamato il metodo
setActionCommand() nel quale ho specificato il comando (cioe' la stringa inventata da me) che verra' ricevuto dal listener.
Un listener e' una classe che implementa l'interfaccia ActionListener, quindi che definisce il metodo actionPerformed().
Ogni item del menu puo' registrare un numero arbitrario di listener. Nel nostro caso, solo uno per voce (sempre lo stesso, la nostra classe principale).
Questa operazione e' fatta con addActionListener().
Alla selezione della voce al menu, i listener registrati verranno chiamati, o meglio verra' chiamata la loro actionPerformed(ActionEvent evt); in evt.getActionCommand() c'e' la stringa che e' stata precedentemente impostata.
E' piu' facile a farsi che a dirsi, spero che la mia descrizione sia abbastanza chiara...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.