为什么我对话框中的JButton看起来很奇怪

时间:2010-07-13 22:26:42

标签: swing awt jframe jbutton

我是Java Swing / AWT等人的新手,因此我提出了这个问题。我有一个简单的对话框,包含一些文本和一对JButton。我正在使用GridbagLayout进行此对话框。

但是当我看到对话框时,JButton有一种奇怪的形状,我似乎无法正确地证明文本的正确性。

这是我正在使用的布局的限制吗?对于我的问题,使用按钮或textlayout是否有更简单和优雅的解决方案?

对话框的屏幕截图如下。

我的对话框Class的代码是:

 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]

alt text http://i26.tinypic.com/24q0p5e.jpg

2 个答案:

答案 0 :(得分:1)

正如@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);

    }

}

答案 1 :(得分:0)

那里有很多更优雅的解决方案..;) 如果不是绝对必要的话(或者仅使用gui编辑器),你真的不应该使用GridbagLayout!这只是屁股的痛苦! 相反,我建议使用以下LayoutManagers之一:

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

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

与GridbagLayout及其配置开销相比,创建令人愉悦的布局更加简单直观。