Почему JButton в моем диалоге выглядит странно - PullRequest
0 голосов
/ 14 июля 2010

Я довольно новичок в Java Swing / AWT и др. И, следовательно, вопрос. У меня простой диалог с текстом и парой JButton. Я использую GridbagLayout для этого диалога.

Но когда я смотрю на диалоговое окно, JButtons вроде как имеют странную форму, и я тоже не могу оправдать текст.

Это ограничение используемого мной макета. Есть ли гораздо более простое и элегантное решение для моей проблемы с кнопками или текстовым макетом?

Снимок экрана с диалогом прилагается ниже.

Код моего диалогового окна Класс:

 public class UpgradePopupWindow extends JPanel implements ActionListener {
static final long serialVersionUID = 0;


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

JPanel panels;
JButton upgradeButton;
JButton restoreButton;
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(new TitledBorder(""));
    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 device's 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);
    gbc.gridy = 0;
    gbc.gridx = 0;
    gbc.gridwidth = 2;
    gbc.weightx = 1.0;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    addMultiLineLabel(text, Font.PLAIN, 12, gbc);

    //addText(text, true, Font.PLAIN);
    addFiller(20);
    newFrame = frame;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;

    upgradeButton = new JButton(upgrade);

    upgradeButton.setActionCommand("upgrade");
    upgradeButton.addActionListener(this);
    upgradeButton.setEnabled(true);
    upgradeButton.setBackground(Color.WHITE);
    upgradeButton.setForeground(Color.GRAY);
    add(upgradeButton,gbc);

    ++ gbc.gridx;
    restoreButton = new JButton(restore);
    restoreButton.setActionCommand("restore");
    restoreButton.addActionListener(this);
    restoreButton.setEnabled(true);
    //restoreButton.setForeground(Color.DARK_GRAY);
    restoreButton.setBackground(Color.DARK_GRAY);
    add(restoreButton,gbc);
    setOpaque(true);
    newFrame.setContentPane(this);
    //newFrame.getContentPane().setBackground(Color.LIGHT_GRAY);
}

protected void addFiller(int size) {
    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(440, 180));
    //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][1]

альтернативный текст http://i26.tinypic.com/24q0p5e.jpg

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Как сказал @Javaguru - используйте MigLayout.Для текста НЕ используйте JTextArea.Этот компонент в основном для редактирования текста.JLabel достаточно для вашей цели - вы даже можете использовать HTML внутри него.

Вам не нужно создавать такого рода диалог с нуля.Есть много вариантов.Одним из них является мой Swing TaskDialog Framework ;)

Но если вы все еще настаиваете на том, чтобы реализовать его самостоятельно, то простая реализация с использованием MigLayout (даже с MigLayout это можно сделать несколькими различными способами):

    import java.awt.Color;
    import java.awt.Dimension;

    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingConstants;

    import net.miginfocom.swing.MigLayout;

public class TestDialog extends JDialog {

    private static final long serialVersionUID = 1L;

    private final JLabel label = new JLabel("Your text here");
    private final JButton restoreButton = new JButton("Restore Previous Version");
    private final JButton ugradeButton = new JButton("Continue Upgrade");



    public TestDialog( String title ) {
        super( (JDialog)null, title );
        setContentPane(createContent());
    }

    private JPanel createContent() {
        JPanel content = new JPanel();
        content.setPreferredSize( new Dimension(400, 100));
        content.setBackground(Color.WHITE);
        content.setLayout(new MigLayout("", "[400px,grow][pref!]", "[grow][pref!]"));
        this.label.setVerticalAlignment(SwingConstants.TOP);
        content.add(this.label, "cell 0 0 2 1,grow");
        content.add(this.restoreButton, "cell 1 1,alignx left,aligny top");
        content.add(this.ugradeButton, "cell 0 1,alignx right,aligny top");
        return content;
    }


    // very simplified test
    public static void main(String[] args) {

        TestDialog dlg =  new TestDialog("Popup Dialog");
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setVisible(true);

    }

}
0 голосов
/ 14 июля 2010

Существует множество гораздо более элегантных решений ..;) Вы действительно никогда не должны использовать GridbagLayout, если в этом нет крайней необходимости (или только с графическим редактором)!Это просто боль в заднице!Скорее, я предлагаю использовать один из следующих LayoutManager:

MigLayout: http://www.miglayout.com/

TableLayout: https://tablelayout.dev.java.net/

Создание приятного макета намного проще и интуитивнее, чем сGridbagLayout и его настройки.

...