Java 如何使用通用JPanel()管理BorderLayout
当JPanel被这样声明时,我不知道如何引用它 这是整个程序的编码:一切正常,但布局不是我想要的。向其中添加边框布局似乎不起作用Java 如何使用通用JPanel()管理BorderLayout,java,swing,jframe,border-layout,Java,Swing,Jframe,Border Layout,当JPanel被这样声明时,我不知道如何引用它 这是整个程序的编码:一切正常,但布局不是我想要的。向其中添加边框布局似乎不起作用 class FrameDemo { public static void main(String[] args) { final JFrame frame = new JFrame("CIT Test Program"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLO
class FrameDemo
{
public static void main(String[] args)
{
final JFrame frame = new JFrame("CIT Test Program");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(350, 250));
frame.add(new JPanel()
{{
String[] tests = {"A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package"};
JComboBox comboBox = new JComboBox(tests);
TextArea text = new TextArea(5,10);
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
this.add(comboBox, BorderLayout.NORTH);
this.add(text, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
add(new JButton("Select")
{{
addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e )
{
frame.dispose();
JOptionPane.showMessageDialog(frame,"IT WORKS!");
}
});
}});
}});
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
}
不确定如何引用JPanel来使用BorderLayout。
我该怎么做呢?如果您在JFrame中添加一个面板(在这里使用
add()
),您可以假定它是作为contentPanel
添加的。然而,最好是明确的。与此相反:
frame.add(new JPanel()
{}
使用以下命令:
JPanel panel = new JPanel(new BorderLayout());
// add your stuff to the panel;
frame.add(panel);
编辑:
在查看您的编辑之后,很明显您正在初始化一个匿名类。这通常不是一个糟糕的做法,但在这里,您需要编写大量的初始化代码。您正在放入的代码位于一个双括号块中,这实际上将它放入一个静态初始值设定项中。它看起来像一个普通的匿名类,但实际上不是。有了这么多代码,它就应该拥有自己的类。如果您甚至编写了一个新类,您应该不会有问题。我建议您随后将其定义为JPanel
的扩展,并在您自己的构造函数中将newborderlayout()
传递给super
编辑2:
如果您创建一个名为Bar
的全新文件/类,并将其编码如下:
public class Bar extends JPanel {
public Bar(final JFrame frame) {
String[] tests = { "A+ Certification", "Network+ Certification",
"Security+ Certification", "CIT Full Test Package" };
JComboBox comboBox = new JComboBox(tests);
TextArea text = new TextArea(5, 10);
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
this.add(comboBox, BorderLayout.NORTH);
this.add(text, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
add(new JButton("Select") {
{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.dispose();
JOptionPane.showMessageDialog(frame, "IT WORKS!");
}
});
}
});
}
使用它所需要做的就是打电话
JPanel panel = new Bar(frame);
但是,这里的目标是使用边界布局
,因此我建议您将此调用放入以开始:
public Bar(final JFrame frame) {
super(new BorderLayout());
.... everything else
}
如果将面板添加到JFrame中(在此处使用
add()
),则可以假定它是作为contentPanel
添加的。然而,最好是明确的。与此相反:
frame.add(new JPanel()
{}
使用以下命令:
JPanel panel = new JPanel(new BorderLayout());
// add your stuff to the panel;
frame.add(panel);
编辑:
在查看您的编辑之后,很明显您正在初始化一个匿名类。这通常不是一个糟糕的做法,但在这里,您需要编写大量的初始化代码。您正在放入的代码位于一个双括号块中,这实际上将它放入一个静态初始值设定项中。它看起来像一个普通的匿名类,但实际上不是。有了这么多代码,它就应该拥有自己的类。如果您甚至编写了一个新类,您应该不会有问题。我建议您随后将其定义为JPanel
的扩展,并在您自己的构造函数中将newborderlayout()
传递给super
编辑2:
如果您创建一个名为Bar
的全新文件/类,并将其编码如下:
public class Bar extends JPanel {
public Bar(final JFrame frame) {
String[] tests = { "A+ Certification", "Network+ Certification",
"Security+ Certification", "CIT Full Test Package" };
JComboBox comboBox = new JComboBox(tests);
TextArea text = new TextArea(5, 10);
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
this.add(comboBox, BorderLayout.NORTH);
this.add(text, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
add(new JButton("Select") {
{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.dispose();
JOptionPane.showMessageDialog(frame, "IT WORKS!");
}
});
}
});
}
使用它所需要做的就是打电话
JPanel panel = new Bar(frame);
但是,这里的目标是使用边界布局
,因此我建议您将此调用放入以开始:
public Bar(final JFrame frame) {
super(new BorderLayout());
.... everything else
}
向其中添加BorderLayout
似乎不起作用
class FrameDemo
{
public static void main(String[] args)
{
final JFrame frame = new JFrame("CIT Test Program");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(350, 250));
frame.add(new JPanel()
{{
String[] tests = {"A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package"};
JComboBox comboBox = new JComboBox(tests);
TextArea text = new TextArea(5,10);
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
this.add(comboBox, BorderLayout.NORTH);
this.add(text, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
add(new JButton("Select")
{{
addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e )
{
frame.dispose();
JOptionPane.showMessageDialog(frame,"IT WORKS!");
}
});
}});
}});
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
}
新的JPanel
的默认布局是FlowLayout
,这可以通过调整框架的大小看到。要查看差异,请替换
frame.add(new JPanel()
与
正如@akf所指出的,使用双大括号进行冗长的静态初始化可能是不明确的
向其中添加BorderLayout
似乎不起作用
class FrameDemo
{
public static void main(String[] args)
{
final JFrame frame = new JFrame("CIT Test Program");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(350, 250));
frame.add(new JPanel()
{{
String[] tests = {"A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package"};
JComboBox comboBox = new JComboBox(tests);
TextArea text = new TextArea(5,10);
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
this.add(comboBox, BorderLayout.NORTH);
this.add(text, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
add(new JButton("Select")
{{
addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e )
{
frame.dispose();
JOptionPane.showMessageDialog(frame,"IT WORKS!");
}
});
}});
}});
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
}
新的JPanel
的默认布局是FlowLayout
,这可以通过调整框架的大小看到。要查看差异,请替换
frame.add(new JPanel()
与
正如@akf所建议的,使用双括号进行冗长的静态初始化可能是不明确的。在所有已经给出的答案之上。。。你的程序有根本性的缺陷。所有Swing组件的操作都必须在EDT线程上完成。因此,您的代码应该略有不同
class FrameDemo
{
public static void main(String[] args)
{
SwingUtilities.invokeLater( new Runnable() {
void run() {
/// your code here
}
});
}
}
否则发生的事情是不可预测的。你可以在上阅读更多关于它的信息,除了已经给出的所有答案之外。。。你的程序有根本性的缺陷。所有Swing组件的操作都必须在EDT线程上完成。因此,您的代码应该略有不同
class FrameDemo
{
public static void main(String[] args)
{
SwingUtilities.invokeLater( new Runnable() {
void run() {
/// your code here
}
});
}
}
否则发生的事情是不可预测的。您可以在上了解更多信息。我在上面插入了整个程序代码,您可以看到代码。按照你的方式添加,我得到了大约33个错误。很抱歉。我会看你的编辑并给你一些反馈。谢谢,别难过。如果你告诉我一些正确的事情,而我只是不明白,那是我的错:PSorry,我对Java有点陌生,我有点理解,但不是真的。在我编写新类的确切位置,对我来说,所有内容都应该在正确的框架中?如果我创建一个新类,它不会在框架中吗?如果你要编写一个新类,你可以创建一个新实例,就像你创建任何其他新对象一样。这真的很简单。我在上面插入了整个程序代码,这样你就可以看到代码了。按照你的方式添加,我得到了大约33个错误。很抱歉。我会看你的编辑并给你一些反馈。谢谢,别难过。如果你告诉我一些正确的事情,而我只是不明白,那是我的错:PSorry,我对Java有点陌生,我有点理解,但不是真的。在我编写新类的确切位置,对我来说,所有内容都应该在正确的框架中?如果我创建一个新类,它不会在框架中吗?如果你要编写一个新类,你可以创建一个新实例,就像你创建任何其他新对象一样。这真的很容易。+1即使不是问题,这也是排除它的唯一方法。+1即使不是问题,这是排除它的唯一方法。