2010-06-25 14 views
1

Je suis un débutant à Java Swing/AWT et j'ai ce code après avoir travaillé pour une boîte de dialogue PopUp simple qui se ferme sur l'un des boutons JButtons cliqué, mais affiche réel foutu. Est-ce que quelqu'un a des suggestions sur quoi et comment résoudre?Pourquoi mon simple JFrame est-il bizarre?

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.Box.Filler; 


public class UpgradePopupWindow extends JPanel implements ActionListener { 
//public static UpgradePopupWindow mainWindow; 

static final long serialVersionUID = 0; 


final String upgrade = "Continue Upgrade"; 
final String restore = "Restore"; 

JPanel panels; 
JButton flashMe; 
JButton helpMe; 
JTextArea Message; 
JFrame newFrame; 
FlasherThread flash; 


protected JTextArea addText(String text, boolean visible, int fontStyle) { 

    JTextArea textArea = new JTextArea(text); 

    textArea.setFont(new Font("SansSerif", fontStyle, 12)); //$NON-NLS-1$ 

    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    textArea.setEditable(false); 
    textArea.setBackground(Color.DARK_GRAY); 
    textArea.setForeground(Color.WHITE); 
    textArea.setOpaque(false); 
    textArea.setVisible(visible); 
    textArea.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(textArea); 

    return textArea; 
} 

private UpgradePopupWindow(JFrame frame, Object ft) { 

    flash = (FlasherThread)ft; 
    String text = "An error occurred during the attempt to update your software. We recommend the following: (1) Restore your device to its previous version, (2) back up important data, and then (3) try updating your device again. If you continue with the current update, only your previously backed-up data will be available."; 
    addFiller(5); 
    addLabel(text, Font.PLAIN, 12); 
    //addText(text, true, Font.PLAIN); 
    addFiller(20); 
    newFrame = frame; 
    flashMe = new JButton(upgrade); 

    flashMe.setActionCommand("upgrade"); 
    flashMe.addActionListener(this); 
    flashMe.setEnabled(true); 
    add(flashMe); 


    helpMe = new JButton(restore); 
    helpMe.setActionCommand("restore"); 
    helpMe.addActionListener(this); 
    helpMe.setEnabled(true); 
    add(helpMe); 
    setOpaque(true); 
    newFrame.setContentPane(this); 
} 

protected JLabel addLabel(String text, int fontStyle, int size) { 
    JLabel label = new JLabel(text); 
    label.setFont(new Font("SansSerif", fontStyle, size)); 
    label.setAlignmentX(Component.CENTER_ALIGNMENT); 
    label.setOpaque(false); 
    label.setVisible(true); 
    //label.setForeground(Color.BLUE); 

    add(label); 
    return label; 
} 

protected void addFiller(int size) { 
    /* 
    * create some space before the progress bar 
    */ 
    Dimension diminsion = new Dimension(size, size); 
    Filler filler = new Filler(diminsion, diminsion, diminsion); 
    filler.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(filler); 
} 

public static void createGUI(Object obj) { 
    //Create and set up the frame. 
    JFrame frame = new JFrame("PopUp Dialog"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setPreferredSize(new Dimension(400, 200)); 
    //create and setup the content pane 
    UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(frame, obj); 

    popUpContentPane.setOpaque(true); 
    frame.setContentPane(popUpContentPane); 

    frame.pack(); 
    frame.setVisible(true); 

} 


public void actionPerformed(ActionEvent e) { 

    if("restore".equals(e.getActionCommand())) { 
     System.out.println("restore button selected"); 
     flash.setUpgradeRestoreChoice("restore"); 
     newFrame.dispose(); 
    } else if ("upgrade".equals(e.getActionCommand())) { 
     System.out.println("upgrade button selected"); 
     flash.setUpgradeRestoreChoice("upgrade"); 
     newFrame.dispose(); 
    } 
} 

}alt text 

alt text http://i46.tinypic.com/2cr7v5f.png

+1

pourrait vous décrivez comment ça montre bizarre? Attacher une image serait mieux, probablement. – Sean

+0

comme cette capture d'écran Je viens de joindre – LambeauLeap

Répondre

2

Je ne vous vois pas en utilisant tout type de mise en page. La conception Swing fonctionne sur les dispositions, puis remplit vos conteneurs avec des éléments à l'intérieur de ces dispositions. Ma disposition préférée personnelle à utiliser est le MigLayout.

Il y a beaucoup de support sur la page Web. Une fois que vous commencez à utiliser des mises en page, votre vie sera beaucoup plus facile quand il s'agit de concevoir en balançoire.

+0

Je comprends à peine BoxLayout, pouvez-vous élaborer un peu plus sur la façon dont je peux introduire une sorte de mise en page dans cette configuration? – LambeauLeap

3

La modification de contentPane de la trame n'est pas nécessaire. Vous pouvez simplement ajouter votre JPanel au cadre. Il remplira le cadre par défaut.

JLabel n'effectue pas d'enrubannage automatique.

Une option consiste à insérer des sauts de ligne manuellement. JLabel accepte un sous-ensemble du langage HTML:

String text = "<html>An error occurred during the attempt to update your software. <br />We recommend the following:<br />(1) Restore your device to its previous version,<br />(2) back up important data, and then<br />(3) try updating your device again.<br />If you continue with the current update, only your previously backed-up data will be available.</html>"; 

Une autre option est d'utiliser un JTextArea en place de l'étiquette. Il n'accepte pas le HTML, mais il peut envelopper les lignes automatiquement et vous pouvez inclure des caractères de nouvelle ligne dans le texte pour forcer les sauts de ligne.

Ne pas oublier d'enlever la frontière et rendre le fond transparent (appel setOpaque(false) fonctionne uniquement avec un certain aspect et se sent et pas d'autres.)

De toute façon, vous devez définir une mise en page sur vos JPanel.

Voici un exemple en utilisant GridBagLayout:

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.WindowConstants; 
import javax.swing.Box.Filler; 


public class UpgradePopupWindow extends JPanel implements ActionListener { 
//public static UpgradePopupWindow mainWindow; 

static final long serialVersionUID = 0; 


final String upgrade = "Continue Upgrade"; 
final String restore = "Restore"; 

JPanel panels; 
JButton flashMe; 
JButton helpMe; 
JTextArea Message; 
JFrame newFrame; 
FlasherThread flash; 


protected JTextArea addText(String text, boolean visible, int fontStyle) { 

    JTextArea textArea = new JTextArea(text); 

    textArea.setFont(new Font("SansSerif", fontStyle, 12)); //$NON-NLS-1$ 

    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    textArea.setEditable(false); 
    textArea.setBackground(Color.DARK_GRAY); 
    textArea.setForeground(Color.WHITE); 
    textArea.setOpaque(false); 
    textArea.setVisible(visible); 
    textArea.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(textArea); 

    return textArea; 
} 

protected JTextArea addMultiLineLabel(String text, int fontStyle, int fontSize, Object constraints) { 

    JTextArea textArea = new JTextArea(text); 

    textArea.setFont(new Font("SansSerif", fontStyle, fontSize)); 

    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    textArea.setEditable(false); 
    textArea.setBackground(new Color(0, 0, 0, 0)); // Zero alpha = transparent background 
    textArea.setOpaque(false); 
    textArea.setBorder(null); 
    textArea.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(textArea, constraints); 

    return textArea; 
} 


private UpgradePopupWindow(JFrame frame, Object ft) { 

    super(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    flash = (FlasherThread)ft; 
    String text = "An error occurred during the attempt to update your software.\nWe recommend the following:\n (1) Restore your device to its previous version,\n (2) back up important data, and then\n (3) try updating your device again.\nIf you continue with the current update, only your previously backed-up data will be available."; 
    addFiller(5); 
    gbc.gridy = 0; 
    gbc.gridx = 0; 
    gbc.gridwidth = 2; 
    gbc.weightx = 1.0; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    addMultiLineLabel(text, Font.PLAIN, 12, gbc); 
    addFiller(20); 
    newFrame = frame; 

    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    gbc.fill = GridBagConstraints.NONE; 
    flashMe = new JButton(upgrade); 
    flashMe.setActionCommand("upgrade"); 
    flashMe.addActionListener(this); 
    flashMe.setEnabled(true); 
    add(flashMe, gbc); 

    ++ gbc.gridx; 
    helpMe = new JButton(restore); 
    helpMe.setActionCommand("restore"); 
    helpMe.addActionListener(this); 
    helpMe.setEnabled(true); 
    add(helpMe, gbc); 
    setOpaque(true); 
    newFrame.add(this); 
} 

protected JLabel addLabel(String text, int fontStyle, int size) { 
    JLabel label = new JLabel(text); 
    label.setFont(new Font("SansSerif", fontStyle, size)); 
    label.setAlignmentX(Component.CENTER_ALIGNMENT); 
    label.setOpaque(false); 
    label.setVisible(true); 
    //label.setForeground(Color.BLUE); 

    add(label); 
    return label; 
} 

protected void addFiller(int size) { 
    /* 
    * create some space before the progress bar 
    */ 
    Dimension diminsion = new Dimension(size, size); 
    Filler filler = new Filler(diminsion, diminsion, diminsion); 
    filler.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(filler); 
} 

public static void createGUI(Object obj) { 
    //Create and set up the frame. 
    JFrame frame = new JFrame("PopUp Dialog"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setPreferredSize(new Dimension(400, 200)); 
    //create and setup the content pane 
    UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(frame, obj); 

    popUpContentPane.setOpaque(true); 
    frame.setContentPane(popUpContentPane); 

    frame.pack(); 
    frame.setVisible(true); 

} 


public void actionPerformed(ActionEvent e) { 

    if("restore".equals(e.getActionCommand())) { 
     System.out.println("restore button selected"); 
     flash.setUpgradeRestoreChoice("restore"); 
     newFrame.dispose(); 
    } else if ("upgrade".equals(e.getActionCommand())) { 
     System.out.println("upgrade button selected"); 
     flash.setUpgradeRestoreChoice("upgrade"); 
     newFrame.dispose(); 
    } 
} 

} 
+0

doux qui aide, même si j'avais une autre question. Qu'est-ce qui contrôle la couleur d'arrière-plan de cette boîte de dialogue? Je voudrais la couleur d'arrière-plan par défaut GRIS/gris clair par défaut. – LambeauLeap

+0

De plus, est-il possible de normaliser le texte de sorte que les bordures gauche et droite de JTextArea soient équidistantes des bords de la boîte de dialogue? – LambeauLeap

+0

Quelques pointeurs ici: http://stackoverflow.com/questions/200106/java-changing-swing-background-colour – finnw

4
  1. Vous devez utiliser un meilleur gestionnaire de mise en page que la valeur par défaut
  2. Vous devez utiliser JOptionPane au lieu de faire votre propre option de dialogue
+0

+1 pour JOptionPane – finnw