简体   繁体   English

按钮和窗口之间的空间

[英]Space between buttons and window

I have this code right here, and the idea is to have two buttons in a main window alongside a text area, which I have not added yet.我在这里有这段代码,我的想法是在主窗口中的文本区域旁边有两个按钮,我还没有添加。 After trying to use GridBagLayout and ripping off my hair in the process I decided not to use a layout and manually position buttons inside a non resizable window.在尝试使用 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){           

}

}

But the output is this:但输出是这样的:在此处输入图片说明

My question is why isn't the space beneath the second button equal to the space above the first button?我的问题是为什么第二个按钮下方的空间不等于第一个按钮上方的空间? Shouldn't they both be 100 pixels?它们不应该都是 100 像素吗?

  • Don't extend JFrame class unnecessarily.不要不必要地扩展JFrame类。
  • Never use Absolute / Null LayoutManager .永远不要使用Absolute / Null LayoutManager Use an appropriate LayoutManager , this includes nesting Layouts to achieve desired look.使用适当的LayoutManager ,这包括嵌套 Layouts 以实现所需的外观。 see here for good tutorials:在这里看到好的教程:
  • Don't call JFrame#setSize(..) on JFrame rather just call JFrame#pack() before setting JFrame visible.不要在JFrame上调用JFrame#setSize(..)而只是在设置JFrame可见之前调用JFrame#pack()
  • Dont use JFrame#setContentPane(...) just use add(..) on JFrame instance不要使用JFrame#setContentPane(...)只需在JFrame实例上使用add(..)
  • Create Event Dispatch Thread to initialize and change UI components创建事件调度线程以初始化和更改 UI 组件
  • Don't implement single ActionListener for multiple components.不要为多个组件实现单个ActionListener Unless it will be accessed by other class(es) or components share a Action .除非它会被其他类或组件共享一个Action Rather use an Anonymous ActionListener而是使用匿名 ActionListener

Here is an example I made (basically your code fixed ) hope it helps:这是我制作的一个示例(基本上是您的代码已修复),希望它有所帮助:

在此处输入图片说明

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);
    }
}

In the above code space between both the buttons is 50px, if you use b2.setBounds(100,300,200,100);上面代码中两个按钮之间的间距是50px,如果使用b2.setBounds(100,300,200,100); then the space will be 100px.那么空间将是100px。 Try it...尝试一下...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM