我这里有这段代码,其想法是在主窗口中在文本区域旁边有两个按钮,但我尚未添加。在尝试使用 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:
我的问题是为什么第二个按钮下方的空间不等于第一个按钮上方的空间?它们不应该都是 100 像素吗?
- 不要延长
JFrame
不必要的类。
- Never use
Absolute
/Null
LayoutManager
. Use an appropriate LayoutManager
, this includes nesting Layouts to achieve desired look. see here for good tutorials:
- 布局管理器的视觉指南 http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
- 使用布局管理器 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html
- 不要打电话
JFrame#setSize(..)
on JFrame
而只是打电话JFrame#pack()
设置前JFrame
可见的。
- 不要使用
JFrame#setContentPane(...)
只需使用add(..)
on JFrame
实例
- Create 事件调度线程 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html初始化和更改 UI 组件
- 不要实施单一
ActionListener
对于多个组件。除非它会被其他类或组件共享一个Action
。而是使用一个匿名动作监听器 http://www.leepoint.net/notes-java/GUI/events/anonymous_listener.html
这是我制作的一个例子(基本上是你的代码fixed) 希望能帮助到你:
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)