我一直在开发一个应用程序,您可以在其中设置包含项目的类别列表,然后将其制作成文本文件。但是我为它制作的GUI并不完全有效。我认为错误位于名为Cat(或“添加类别”)的JMenuItem中,或者在我显示Categories(Update()方法)的方式中。它应该要求一个名称,创建一个以此命名的类别并将其显示在JScrollPane中,但什么都没有出现。这是代码:
public class GUIBuilder {
public JFrame frame;
public JPanel LeftPanel;
public JPanel RightPanel;
public JScrollPane scroll;
public JMenuBar bar;
public JMenu File;
public JMenu Add;
Inventory inv;
public void go() {
frame = new JFrame();
scroll = new JScrollPane();
bar = new JMenuBar();
File = new JMenu("File");
Add = new JMenu("Add...");
bar.add(File);
bar.add(Add);
JMenuItem Save = new JMenuItem(new AbstractAction("Save") {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent arg0) {
}
});
JMenuItem Load = new JMenuItem(new AbstractAction("Load") {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent arg0) {
}
});
JMenuItem Generate = new JMenuItem(new AbstractAction("Generate Text File") {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent arg0) {
}
});
File.add(Save);
File.add(Load);
File.add(Generate);
JMenuItem Cat = new JMenuItem(new AbstractAction("Add Category") {
private static final long serialVersionUID = 1L;
JFrame Cat;
public void actionPerformed(ActionEvent arg0) {
Cat = new JFrame("Add Category");
final JTextField name = new JTextField(15);
JButton Submit = new JButton(new AbstractAction("Submit") {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent arg0) {
String n = name .getText();
if (n != null) {
inv.addCategory(new Category(n));
pullThePlug();
GUIBuilder.this.Update();
}
}
});
Cat.setLayout(new BorderLayout());
Cat.add(name, BorderLayout.CENTER);
Cat.add(Submit, BorderLayout.SOUTH);
Cat.setSize(250, 150);
Cat.setVisible(true);
}
public void pullThePlug() {
WindowEvent wev = new WindowEvent(Cat, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
}
});
JMenuItem item = new JMenuItem(new AbstractAction("Add Item") {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent arg0) {
}
});
Add.add(Cat);
Add.add(item);
frame.setJMenuBar(bar);
frame.setSize(500, 800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(scroll);
inv = new Inventory();
}
public void Update() {
for (int i = 0; i < inv.categories.size(); i++) {
Category cat = inv.categories.get(i);
JPanel p = new JPanel();
JTextPane name = new JTextPane();
name.setText(cat.getName());
scroll.add(p);
}
}
}
提前致谢;)
答案 0 :(得分:4)
您需要将JTextPane name
添加到JPanel p
。
(在我看来,你错过了一个构建main
的{{1}}方法 - 但是可能是你未在问题中显示的另一个文件?)
此外,如果您创建一个空的GUIBuilder
,则需要通过JScrollPane
添加组件。
您还需要一些布局管理。最简单的方法(也可能是你打算做的事情)是:
scrollpane.getViewport().add(yourcomponent);
答案 1 :(得分:2)
在显示inv
之前初始化JFrame
可能更好
你也应该交换语句
frame.setVisible(true);
frame.add(scroll);
到
frame.add(scroll);
frame.setVisible(true);
因此,添加JScrollpane
后无需重新绘制。在组件已经显示的同时添加组件非常棘手
我真的建议你用frame.setVisible(true);
来结束你的方法,或者甚至将这个语句提取到一个自己的方法,当go()
完成时它会被调用。
......那么,最好将go()
重命名为init()
,但这是另一回事;)。划分构造和展示框架是我眼中的一个好习惯
修改强>
重新阅读代码后,我无法看到JScrollpane
被填充的位置。你在哪里添加东西?
您还应该阅读Java Coding Conventions,因为属性不应该以大写字母开头。这将提高代码的可读性。