如何在表/面板/ JFrame中使用SWING / JButton正确定位按钮

时间:2012-10-31 15:03:48

标签: java swing

我正在从文件中读取信息并将其放在表格中。这个代码不是我的,但正是我需要的,所以我试着保留它并使它对我有用。我需要添加的是5-6个按钮和它们的功能,但对于使用SWING来说还是全新的我很难完成两者 - 保留现有代码并在适当的位置添加按钮位置。

这是我的文件,第一部分是表格的制作地点,我尝试将代码包含在一个按钮中:

public class DataFileTable extends JPanel {
  public DataFileTable(String dataFilePath) {
    JTable table;
    DataFileTableModel model;
    Font f;

    f = new Font("SanSerif",Font.PLAIN,24);
    setFont(f);
    setLayout(new BorderLayout());

    model = new DataFileTableModel(dataFilePath);

    table = new JTable();
    table.setModel(model);
    table.createDefaultColumnsFromModel();
    //Try to add button
    JButton button = new JButton("First Button");
    button.setSize(80,20);
    button.setVerticalAlignment(SwingConstants.BOTTOM);
    button.setHorizontalAlignment(SwingConstants.RIGHT);
    //End button part
    JScrollPane scrollpane = new JScrollPane(table);
    scrollpane.add(button);//Add button 
    add(scrollpane);

    }

,第二部分主要是main函数:

public Dimension getPreferredSize(){ 

    return new Dimension(400, 300);
    }

 public static void main(String s[]) {
    JFrame frame = new JFrame("Data File Table");
    DataFileTable panel;

    panel = new DataFileTable("customers.dat");

    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.setForeground(Color.black);
    frame.setBackground(Color.lightGray);
    frame.getContentPane().add(panel,"Center");

    frame.setSize(panel.getPreferredSize());
    frame.setVisible(true);
    frame.addWindowListener(new WindowCloser());
    }
 }

class WindowCloser extends WindowAdapter {
 public void windowClosing(WindowEvent e) {
   Window win = e.getWindow();
   win.setVisible(false);
   System.exit(0);
    }
}

以下是我使用此代码获得的PrintScreen:

enter image description here

我不是在寻找最好的外观和感觉,但如果我能保留当前代码并在底部的某处添加按钮,那将是非常好的。我尝试将按钮直接添加到main frame.add(button)的{​​{1}}框架中,但即使我设置了尺寸,按钮也占据了所有空间,而且桌子不再可见。

5 个答案:

答案 0 :(得分:7)

您无法执行以下操作:

JScrollPane scrollpane = new JScrollPane(table);
scrollpane.add(button);//Add button 
add(scrollpane);

因为滚动窗格只能有一个显示表格的Viewport

我建议:

add(scrollpane, BorderLayout.CENTER );

JToolBar toolbar = new JToolBar();
toolbar.add( button1 );
toolbar.add( button2 );
toolbar.add( button3 );
...
add( toolbar, BorderLayout.NORTH );

查看JToolBar

的文档

答案 1 :(得分:3)

使用swing布局管理器:http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/

我建议您使用2个面板:一个用于您的桌面,另一个用于您的按钮,使用正确的布局,如上所述

答案 2 :(得分:2)

问题是您不必在set[Mininum|Maximum|Preferred]Size()组件上调用Swing方法(如果LayoutManager忽略其提示并且最终可能破坏布局本身,那些方法无效)。

这是因为在SwingComponent唯一有责任确定LayoutManager儿童的正确人数Component。请查看此thread以获取进一步说明,或访问Oracle的tutorial

如果您需要正确布局组件,请向您的父LayoutManager {{1}}添加一个。{/ p>

答案 3 :(得分:1)

我会为你节省很多头发和时间。

使用swing时,不应该看任何比GridBagLayout更多的东西。

相信我,了解如何使用GridBag。它看起来很复杂,会破裂。但它是唯一有用且值得学习的布局管理器,因为你最终可能会使用它......非常多。

所以,请记住 - http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

答案 4 :(得分:0)

如果您需要快速制作GUI,我建议使用Netbeans GUI代码生成器,它使您能够拖放Java Swing元素。或者您可以安装Eclipse的WindowBuilder插件。

虽然这些“代码生成器”有点不受欢迎,但是你不需要自己学习如何格式化它们,它们在学习时很有用。

事实上,这些WYSIWYG编辑教我HTML。 :)