0

我想用 Swing 制作简单的 GUI,它将有 2 个输入文本字段和一个按钮。

根据输入,程序将从表中获取 ///并需要name显示到同一屏幕下方的文本区域中。文本区域应该是可滚动的。我希望输入/输出在同一个屏幕上。有人能说出哪种布局最适合这个吗?rol-noageemailid

---------------------------------------------------------------------------
School(label1):textfield1____
class(label2):textfield2____
SUbmit(Button1)

      name(label2)     roll-no(label3)      age(label4)   email-id(label5) 
row-1  -----
row-2  ----
row-3  ----
row-4  ----
.
.
row-nth ---
----------------------------------------------------------------------------


尝试使用以下代码..但表格定位不正确。请帮助。公共类测试{

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    final JFrame f = new JFrame();
    f.setSize(1000, 1000);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setResizable(true);

    final JPanel pnl = new JPanel(new GridBagLayout());
    final GridBagConstraints c = new GridBagConstraints();

    JLabel lbl = new JLabel("School ");
    c.gridx = 0;
    c.gridy = 0;
    pnl.add(lbl, c);

    final JTextField tf = new JTextField(20);
    c.gridx = 1;
    c.gridy = 0;
    tf.setText("");
    pnl.add(tf, c);

    JLabel lb2 = new JLabel("Class");
    c.gridx = 0;
    c.gridy = 1;
    pnl.add(lb2, c);

    final JTextField tf2 = new JTextField(20);
    c.gridx = 1;
    c.gridy = 1;
    tf2.setText("");
    pnl.add(tf2, c);

    final String[] columnNames = { "name", "roll-no", "age", "email-id" };
    Object[][] columnData = new String[2][4];
    columnData[0][0] = "X";
    columnData[0][1] = "1";
    columnData[0][2] = "22";
    columnData[0][3] = "X@XMAIL.COM";
    columnData[1][0] = "Y";
    columnData[1][1] = "2";
    columnData[1][2] = "24";
    columnData[1][3] = "Y@XMAIL.COM";
    JTable table = new JTable(columnData, columnNames);
    table.setBounds(300, 600, 700, 150);

    JScrollPane scrollpane = new JScrollPane(table);
    pnl.add(scrollpane);

    f.getContentPane().add(BorderLayout.NORTH, pnl);
    f.setVisible(true);

}

}

4

3 回答 3

1

我会从JPanelusing开始BorderLayout,我们暂时称它为content...

然后我会创建一个JPanelusing aGridBagLayout并将您的字段添加到它,让我们form现在调用它...

我会添加formcontentinBorderLayout.NORTH位置。

然后我会JTable在 aJScrollPaneBorderLayout.CENTER位置添加一个 ,content

在此处输入图像描述

首先看看...

更多细节...

根据更新的问题更新了示例

你的意思更像...

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLayout30 {

    public static void main(String[] args) {
        new TestLayout30();
    }

    public TestLayout30() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        public MainPane() {            
            setLayout(new BorderLayout());

            JPanel pnl = new JPanel(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();

            JLabel lbl = new JLabel("School ");
            c.gridx = 0;
            c.gridy = 0;
            c.anchor = GridBagConstraints.WEST;
            pnl.add(lbl, c);

            final JTextField tf = new JTextField(20);
            c.gridx = 1;
            c.gridy = 0;
            c.weightx = 1;
            tf.setText("");
            pnl.add(tf, c);

            JLabel lb2 = new JLabel("Class");
            c.gridx = 0;
            c.gridy = 1;
            c.weightx = 0;
            pnl.add(lb2, c);

            final JTextField tf2 = new JTextField(20);
            c.gridx = 1;
            c.gridy = 1;
            c.weightx = 1;
            tf2.setText("");
            pnl.add(tf2, c);

            add(pnl, BorderLayout.NORTH);

            final String[] columnNames = {"name", "roll-no", "age", "email-id"};
            Object[][] columnData = new String[2][3];
            columnData[0][0] = "X";
            columnData[0][4] = "1";
            columnData[0][5] = "22";
            columnData[0][6] = "X@XMAIL.COM";
            columnData[1][0] = "Y";
            columnData[1][7] = "2";
            columnData[1][8] = "24";
            columnData[1][9] = "Y@XMAIL.COM";
            JTable table = new JTable(columnData, columnNames);
            table.setBounds(300, 600, 700, 150);

            JScrollPane scrollpane = new JScrollPane(table);
            add(scrollpane);

        }
    }
}

不要将所有字段和表格添加到同一个面板,而是使用“主”面板,该面板使用 aBorderLayout并将字段(在单独的面板上)添加到NORTH位置,将表格添加到CENTER位置。这通常称为复合布局。它允许您设计复杂的布局,并尝试将其全部放入单个组件中......

您还可以使用GridBagConstraints weightx = 1, weighty = 1, fill = GridBagConstraints.BOTH,gridwidth = GridBagConstraints.REMAINDER添加表格,但这会变得混乱......

更新了可选择但不可编辑的示例

DefaultTableModel默认情况下是可编辑的。改变它的唯一方法是覆盖该isCellEditable方法并使其return false

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestLayout30 {

    public static void main(String[] args) {
        new TestLayout30();
    }

    public TestLayout30() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        public MainPane() {            
            setLayout(new BorderLayout());

            JPanel pnl = new JPanel(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();

            JLabel lbl = new JLabel("School ");
            c.gridx = 0;
            c.gridy = 0;
            c.anchor = GridBagConstraints.WEST;
            pnl.add(lbl, c);

            final JTextField tf = new JTextField(20);
            c.gridx = 1;
            c.gridy = 0;
            c.weightx = 1;
            tf.setText("");
            pnl.add(tf, c);

            JLabel lb2 = new JLabel("Class");
            c.gridx = 0;
            c.gridy = 1;
            c.weightx = 0;
            pnl.add(lb2, c);

            final JTextField tf2 = new JTextField(20);
            c.gridx = 1;
            c.gridy = 1;
            c.weightx = 1;
            tf2.setText("");
            pnl.add(tf2, c);

            add(pnl, BorderLayout.NORTH);

            final String[] columnNames = {"name", "roll-no", "age", "email-id"};
            DefaultTableModel model = new DefaultTableModel(columnNames, 0) {

                @Override
                public boolean isCellEditable(int row, int column) {
                    return false;
                }

            };
            Object[][] rowData = new String[2][11];
            rowData[0][0] = "X";
            rowData[0][12] = "1";
            rowData[0][13] = "22";
            rowData[0][14] = "X@XMAIL.COM";
            rowData[1][0] = "Y";
            rowData[1][15] = "2";
            rowData[1][16] = "24";
            rowData[1][17] = "Y@XMAIL.COM";

            for (Object[] row : rowData) {
                model.addRow(row);
            }

            JTable table = new JTable(model);
            JScrollPane scrollpane = new JScrollPane(table);
            add(scrollpane);
        }
    }
}

另外,避免使用setBounds,它只会产生更多的问题然后解决......

于 2013-09-02T06:11:26.047 回答
0

我厌倦了没有多大意义的 Java 复杂布局管理器,并转向:

http://www.miglayout.com/

易于安装,10 ~ 20 分钟即可掌握所有基础知识,简直就是天堂,让我的设计变得更加轻松。我推荐它而不是其他布局管理器。

于 2013-09-02T17:19:34.247 回答
0

您可以使用 TableLayout 或 GridBagLayout。这是两者的链接。
1. GridBagLayout
2. TableLayout

于 2013-09-02T05:44:29.277 回答