【问题标题】:Space between buttons and window按钮和窗口之间的空间
【发布时间】:2012-10-13 09:44:48
【问题描述】:

我在这里有这段代码,想法是在主窗口中在文本区域旁边有两个按钮,我还没有添加。在尝试使用 GridBagLayout 并在此过程中扯掉我的头发后,我决定不使用布局并在不可调整大小的窗口内手动定位按钮。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Tema extends JFrame implements ActionListener {

JMenuBar menubar = new JMenuBar();
JMenu actiuni = new JMenu("Actiuni");
JMenu contact = new JMenu("Contact");
JMenu help = new JMenu("Help");
JMenuItem ntest = new JMenuItem("Nou test");
JMenuItem vizarh = new JMenuItem("Vizualizare arhiva");
JMenuItem datcon = new JMenuItem("Date de contact");
JMenuItem sendmail = new JMenuItem("Trimite e-mail");
JMenuItem instrut = new JMenuItem("Instructiuni de utilizare");
JButton b1 = new JButton("Incepe testul!");
JButton b2 = new JButton("Vezi arhiva!");
JTextArea ta = new JTextArea("Default text", 5, 30);

public void common(String s)
{
    setSize(800,450);
    setLocationRelativeTo(null);
    setResizable(false);

    setTitle(s);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    menubar.add(actiuni);
    menubar.add(contact);
    menubar.add(help);
    actiuni.add(ntest);
    actiuni.add(vizarh);
    contact.add(datcon);
    contact.add(sendmail);
    help.add(instrut);

    setJMenuBar(menubar);

}

public Tema()
{
    common("Self-Esteem- Fereastra Principala");
    JPanel cp = new JPanel();
    cp.setLayout(null);


    b1.setBounds(100,100,200,100);
    cp.add(b1);


    b2.setBounds(100,250,200,100);
    cp.add(b2);

    setContentPane(cp);
    setVisible(true);

}

public static void main(String[] args)
{
    Tema x = new Tema();
}


@Override
public void actionPerformed (ActionEvent e){           

}

}

但是输出是这样的:

我的问题是为什么第二个按钮下方的空间不等于第一个按钮上方的空间?它们不应该都是 100 像素吗?

【问题讨论】:

  • 决定不使用布局 错误的决定:您总是想要使用 LayoutManager。了解如何使用它们,f.i.在swing tag wiki中引用的教程中:-)

标签: java swing user-interface jbutton layout-manager


【解决方案1】:
  • 不要不必要地扩展 JFrame 类。
  • 永远不要使用Absolute/NullLayoutManager。使用适当的LayoutManager,这包括嵌套布局以实现所需的外观。看这里的好教程:
  • 不要在JFrame 上调用JFrame#setSize(..),而是在设置JFrame 可见之前调用JFrame#pack()
  • 不要使用JFrame#setContentPane(...),只需在JFrame 实例上使用add(..)
  • 创建 Event Dispatch Thread 以初始化和更改 UI 组件
  • 不要为多个组件实现单个ActionListener。除非它将被其他类或组件访问,否则共享Action。而是使用Anonymous ActionListener

这是我制作的一个示例(基本上是您的代码已修复)希望对您有所帮助:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class LayoutTest {

    private final JMenuBar menubar = new JMenuBar();
    private final JMenu actiuni = new JMenu("Actiuni");
    private final JMenu contact = new JMenu("Contact");
    private final JMenu help = new JMenu("Help");
    private final JMenuItem ntest = new JMenuItem("Nou test");
    private final JMenuItem vizarh = new JMenuItem("Vizualizare arhiva");
    private final JMenuItem datcon = new JMenuItem("Date de contact");
    private final JMenuItem sendmail = new JMenuItem("Trimite e-mail");
    private final JMenuItem instrut = new JMenuItem("Instructiuni de utilizare");
    private final JButton b1 = new JButton("Incepe testul!");
    private final JButton b2 = new JButton("Vezi arhiva!");
    private final JTextArea ta = new JTextArea("Default text", 5, 30);
    //create JFrame instance
    private final JFrame frame = new JFrame();

    public LayoutTest() {
        initComponents();
    }

    public static void main(String[] args) {
        //creat UI on EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LayoutTest();
            }
        });
    }

    private void initComponents() {
        frame.setTitle("Self-Esteem- Fereastra Principala");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        menubar.add(actiuni);
        menubar.add(contact);
        menubar.add(help);
        actiuni.add(ntest);
        actiuni.add(vizarh);
        contact.add(datcon);
        contact.add(sendmail);
        help.add(instrut);

        frame.setJMenuBar(menubar);
        JPanel textAreaJPanel = new JPanel();

        //create button panel with GridLayout(2,1) 
        JPanel buttonJPanel = new JPanel(new GridLayout(2, 1));//new GridLayout(2, 1,10,10) creates gridlayout with horixontal and vertcial spacing of 10

        //add buttons to one panel
        buttonJPanel.add(b1);
        buttonJPanel.add(b2);
        //add text area to textarea jPanel
        textAreaJPanel.add(ta);

        //add textarea panel to west of content pane (BorderLayout by default)
        frame.add(textAreaJPanel, BorderLayout.WEST);

        //add button Panel to EAST of JFrame content pane
        frame.add(buttonJPanel, BorderLayout.EAST);

        frame.pack();

        frame.setResizable(false);
        frame.setLocationRelativeTo(null);

        frame.setVisible(true);
    }
}

【讨论】:

    【解决方案2】:

    在上面的代码中两个按钮之间的空间是50px,如果你使用b2.setBounds(100,300,200,100);那么空间将是100px。试试看……

    【讨论】:

    • 本论坛不倾向于使用AbsoluteLayout,导致Swing GUI中缺少一些不正确的GPU,必须使用Insets from near container,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多