问题描述
我在这里有此代码,其想法是在主窗口中的文本区域旁边有两个按钮,而这些按钮我尚未添加.在尝试使用GridBagLayout并在过程中扯掉头发后,我决定不使用布局并在不可调整大小的窗口内手动放置按钮.
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.
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:
我的问题是,第二个按钮下方的空间为什么不等于第一个按钮上方的空间?它们都不应该都是100像素吗?
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?
推荐答案
- 不要不必要地扩展
JFrame
类. - 请勿使用
Absolute
/Null
LayoutManager
.使用适当的LayoutManager
,其中包括嵌套布局以实现所需的外观.请参阅此处以获得良好的教程:- 布局管理器的可视指南
- 使用布局管理器
- Don't extend
JFrame
class unnecessarily. - Never use
Absolute
/Null
LayoutManager
. Use an appropriateLayoutManager
, this includes nesting Layouts to achieve desired look. see here for good tutorials:- A Visual Guide to Layout Managers
- Using Layout Managers
以下是我提出的示例(基本上是您的代码已修复)希望对您有所帮助:
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); } }
这篇关于按钮和窗口之间的空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!